举例:di-annotation 项目
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 bean 实例。Spring 中使用注解,需要在原有 Spring 运行环境基础上再做一些改变,完成以下三个步骤。
1、导入 AOP 的 Jar 包。因为注解的后台实现用到了 AOP 编程。
2、 需要更换配置文件头,即添加相应的约束。
约束在 %SPRING_HOME%\docs\spring-framework-reference\html\xsd-configuration.html 文件中。
3、需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
(1)使用多个 context:component-scan 指定不同的包路径
(2) 指定 base-package 的值使用分隔符
分隔符可以使用逗号(,)分号(;)还可以使用空格,不建议使用空格。
逗号分隔:
分号分隔:
(3) base-package 是指定到父包名
base-package 的值表是基本包,容器启动会扫描包及其子包中的注解,当然也会扫描到子包下级的子包。所以 base-package 可以指定一个父包就可以。
或者最顶级的父包
但不建议使用顶级的父包,扫描的路径比较多,导致容器启动时间变慢。指定到目标包和合适的。也就是注解所在包全路径。例如注解的类在 com.bjpowernode.beans 包中
需要在类上使用注解@Component,该注解的 value 属性用于指定该 bean 的 id 值。
举例:di01
另外,Spring 还提供了 3 个功能基本和@Component 等效的注解:
● @Repository 用于对 DAO 实现类进行注解
● @Service 用于对 Service 实现类进行注解
● @Controller 用于对 Controller 实现类进行注解
之所以创建这三个功能与@Component 等效的注解,是为了以后对其进行功能上的扩展。
@Component 不指定 value 属性,bean 的 id 是类名的首字母小写。
需要在属性上使用注解@Value,该注解的 value 属性用于指定要注入的值。
使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter,则也可将其加到 setter 上。
举例:
需要在引用属性上使用注解@Autowired,该注解默认使用按类型自动装配 Bean 的方式。
使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter,则也可将其加到 setter 上。
举例:
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。同样类中无需 setter,也可加到 setter 上。
举例:
@Autowired 还有一个属性 required,默认值为 true,表示当匹配失败后,会终止程序运行。若将其值设置为 false,则匹配失败,将被忽略,未匹配的属性值为 null。
Spring提供了对 jdk中@Resource注解的支持。@Resource 注解既可以按名称匹配Bean,也可以按类型匹配 Bean。默认是按名称注入。使用该注解,要求 JDK 必须是 6 及以上版本。
@Resource 可在属性上,也可在 set 方法上。
1、byType 注入引用类型属性
@Resource 注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入 bean,则会按照类型进行 Bean 的匹配注入。
举例:
2、byName 注入引用类型属性
@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id。
举例:
在方法上使用@PostConstruct 与原来的 init-method 等效。在方法上使用@PreDestroy,与 destroy-method 等效。
举例:
注解优点是:
● 方便
● 直观
● 高效(代码少,没有配置文件的书写那么复杂)。
其弊端也显而易见:以硬编码的方式写入到Java代码中,修改是需要重新编译代码的。
● 配置和代码是分离的
● 在xml中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
● xml的缺点是:编写麻烦,效率低,大型项目过于复杂。