注:spring 是统一管理所有类的,所以也可以管理 Controller 层的类,但是 Controller 层的类,属于 spring-mvc 的管理范围,所以这里,仅仅测试 spring 的注解模式效果(即测试 Service 层使用注解模式的效果)
一、配置 spring-context.xml (其他别名:spring.xml 或 context.xml 或 springContext.xml 或 application.xml 或 applicationContext.xml)
1> 创建
右击项目结构中的 resources
文件夹,选择 New
-> File
如图:
2> 配置 spring-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 使用 Annotation 自动注册 Bean,在主容器中不扫描 @Controller 注解,在 SpringMVC 中只扫描 @Controller 注解。-->
<context:annotation-config /><!--声明注解配置,开启注解模式-->
<context:component-scan base-package="com.piglegend.ssm">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/><!--不扫描@Controller注解-->
</context:component-scan><!--告诉Spring开启注解的类在那个包下(组件扫描的意思)-->
</beans>
在 service 包下创建如下结构:
其中 test
为一个接口,testImpl 为一个接口实现类
输入 test
接口代码
package com.piglegend.ssm.service;
public interface test {
public String sayHi();
}
输入 testImpl
代码
package com.piglegend.ssm.service.Impl;
import com.piglegend.ssm.service.test;
import org.springframework.stereotype.Service;
@Service(value = "testImpl")
public class testImpl implements test {
public String sayHi() {
System.out.println("测试成功");
return null;
}
}
在 test
文件夹下创建一个类 ServiceTest
import com.piglegend.ssm.service.Impl.testImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ServiceTest {
/**
* 执行测试方法前执行
*/
@Before
public void before() {
System.out.println("执行 before() 方法,开始测试;");
}
/**
* 执行测试方法后执行
*/
@After
public void after() {
System.out.println("执行 after() 方法,测试完毕;");
}
@Test
public void testSayHi() {
// 获取 Spring 容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
// 从 Spring 容器中获取对象
testImpl testimpl = (testImpl) applicationContext.getBean("testImpl");
testimpl.sayHi();
}
}
右击 @Test
测试方法,点击运行
运行结果:
输出,testImpl 函数中的 测试成功
字段,说明 spring 注解模式已经成功将 testImpl 注入容器了
对于 spring 容器 注解的简介:
@Component(value=“beanId”)
需要在普通类上使用注解 @Component,该注解的 value 属性用于指定该 bean 的 id 值
@Repository(value=“beanId”)
用于对 DAO 实现类进行注解
@Service(value=“beanId”)
用于对 Service 实现类进行注解
@Controller(value=“beanId”)
用于对 Controller 实现类进行注解
@Scope(“prototype”)
需要在类上使用注解 @Scope,其 value 属性用于指定作用域。默认为 singleton。
singleton:单态模式。即在整个 Spring 容器中,使用 singleton 定义的 Bean 将是单例的,只有一个实例。默认为单态的。
prototype:原型模式。即每次使用 getBean 方法获取的同一个 <bean /> 的实例都是一个新的实例。
对于 scope 为 singleton 的单例模式,该 Bean 是在容器被创建时即被装配好了。
对于 scope 为 prototype 的原型模式,Bean 实例是在代码中使用该 Bean 实例时才进行装配的
@Value(“value”)
需要在属性上使用注解 @Value,该注解的 value 属性用于指定要注入的值。
使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter,则也可将其加到 setter 上。
@Autowired
需要在域属性上使用注解 @Autowired,该注解默认使用 按类型自动装配 Bean 的方式。
使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter,则也可将其加到 setter 上。
@Resource(name="")
需要在域属性上使用注解 @Resource,该注解有一个 name 属性,可以创建指定的 bean
@PostConstruct
在方法上使用 @PostConstruct 相当于初始化