基于注解的 DI
举例:Spring_DI_Annotation 项目。
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 Bean 实例。Spring 中使用注解,需要在原有 Spring 运行环境基础上再做一些改变,完成以下三个步骤。
(1)导入 AOP 的 Jar 包。因为注解的后台实现用到了 AOP 编程。
(2)需要更换配置文件头,即添加相应的约束。
约束在%SPRING_ HOME%\docs\spring framework-reference\html\xsd-configuration.html 文件中。
(3)需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
定义 Bean@Component
需要在类上使用注解@Component,该注解的 value 属性用于指定该 bean 的 id 值。
举例:di01。
另外,Spring 还提供了3个功能基本和@Component等效的注解:
① @Repository:用于对DAO实现类进行注解。
② @Service:用于对Service实现类进行注解。
③ @Controller:用于对Controller实现类进行注解。
之所以创建这三个功能与@Component等效的注解,是为了以后对其进行功能上的扩展,使它们不再等效。
Bean 的作用域@Scope
需要在类上使用注解@Scope,其中 value 属性用于指定作用域。默认为 singleton。
举例:di01。
基本类型属性注入@Value
需要在属性上使用注解@Value,该注解的 value 属性用于指定要注入的值。
使用该注解完成属性注入时,类中无需 setter。当然,若属性有setter,则也可将其加到setter上。
举例: di01。
按类型注入域属性@Autowired
需要在域属性上使用注解@Autowired,该注解默认使用按类型自动装配 Bean 的方式。
使用该注解完成属性注入时,类中无需 setter。 当然,若属性有 setter, 则也可将其加到 setter 上。
举例: di02。
按名称注入域属性@Autowired 与 @Qualifier
需要在域属性上联合使用注解@Autowired 与 @Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。同样类中无需 setter,也可加到 setter 上。
举例: di03。
@Autowired 还有一个属性 required,默认值为 true,表示当匹配失败后,会终止程序运行。若将其值设置为 false,则匹配失败,将被忽略,未匹配的属性值为 null。
域属性注解@Resource
Spring 提供了对 JSR-250 规范中定义 @Resource 标准注解的支持。@Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。使用该注解,要求 JDK 必须是 6 及以上版本。
(1)按类型注入域属性
@Resource 注解若不带任何参数,则会按照类型进行 Bean 的匹配注入。
举例:di04。
(2)按名称注入域属性
@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id 。
举例:di05。
Bean 的声明始末@PostConstruct 与 @PreDestroy
在方法上使用 @PostConstruct,与原来的 init-method 等效。在方法上使用 @PreDestroy 与 destroy-method 等效。
举例: di05。
使用 JavaConfig 进行配置(了解)
JavaConfig,是在 Spring 3.0 开始从一个独立的项目并入到 Spring 中的。JavaConfig 可以看成一个用于完成 Bean 装配的 Spring 配置文件,即 Spring 容器,只不过该容器不是 XML 文件,而是由程序员使用 Java 自己编写的 Java 类。
举例: di06 包。
(1)定义实体类
(2)定义 JavaConfig 类
对于一个 POJO 类,在类上使用 @Configuration 注解,将会使当前类作为一个 Spring 的容器来使用,用于完成 Bean 的创建。
在该 JavaConfig 的方法上使用 @Bean,将会使一个普通方法所返回的结果变为指定名称的 Bean 实例。
当然,在 JavaConfig 中,也可以完成域属性的自动注入。
A、byType 方式的域属性自动注入
B、byName 方式的域属性自动注入
(3)定义 Spring 配置文件
(4)定义测试类
使用 JUnit4 测试 Spring
使用 Spring 的 JUnit4 对 Spring 代码进行测试,将不再需要在程序的代码中直接写出创建 Spring 容器,及从 Spring 容器中通过 getBean() 获取对象了。这些工作将由 JUnit4 注解,配合着域属性的自动注入注解共同完成。
举例: di07 包。
(1)导入 Jar 包
除了 junit-4.9.jar 外,还需导入 Spring 框架的解压目录中的 Spring 与 JUnit4 的整合Jar:spring-test-4.2.1.RELEASE.jar
(2)定义被测试的类
(3)定义 Spring 配置文件
(4)定义测试类
在类头添加的两个注解:
@RunWith(SpringJUnit4ClassRunner.class):用于指定运行环境。
@ContextConfiguration(locations=""):用于指定配置文件位置。
对于需要从容器中获取的 Bean 对象,使用 byType 或 byName 方式,将其自动注入。然后就可以直接测试对象了。
- 注解与 XML 共同使用
注解的好处是,配置方便,直观。但其弊端也显而易见:以硬编码的方式写入到了 Java 代码中,其修改是需要重新编译代码的。
XML 配置方式的最大好处是,对其所做修改,无需编译代码,只需重启服务器即可将新的配置加载。
若注解与 XML同用,XML 的优先级要高于注解。这样做的好处是,需要对某个 Bean 做修改,只需修改配置文件即可。当然,此时, Bean 类要有 seter 或构造器。
网友评论