Spring框架教程
Spring IOC控制反转
Spring AOP面向切面编程
Spring集成MyBatis
Spring事务
Spring与Web

Spring中基于注解的DI依赖注入

举例: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 包中

定义 Bean 的注解@Component

需要在类上使用注解@Component,该注解的 value 属性用于指定该 bean 的 id 值。

举例:di01

另外,Spring 还提供了 3 个功能基本和@Component 等效的注解:

● @Repository 用于对 DAO 实现类进行注解

● @Service 用于对 Service 实现类进行注解

● @Controller 用于对 Controller 实现类进行注解

之所以创建这三个功能与@Component 等效的注解,是为了以后对其进行功能上的扩展。

@Component 不指定 value 属性,bean 的 id 是类名的首字母小写。

 

简单类型属性注入@Value

需要在属性上使用注解@Value,该注解的 value 属性用于指定要注入的值。

使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter,则也可将其加到 setter 上。

举例:

byType 自动注入@Autowired

需要在引用属性上使用注解@Autowired,该注解默认使用按类型自动装配 Bean 的方式。

使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter,则也可将其加到 setter 上。

举例:

byName 自动注入@Autowired 与@Qualifier

需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。同样类中无需 setter,也可加到 setter 上。

举例:

@Autowired 还有一个属性 required,默认值为 true,表示当匹配失败后,会终止程序运行。若将其值设置为 false,则匹配失败,将被忽略,未匹配的属性值为 null。

 

JDK 注解@Resource 自动注入 

Spring提供了对 jdk中@Resource注解的支持。@Resource 注解既可以按名称匹配Bean,也可以按类型匹配 Bean。默认是按名称注入。使用该注解,要求 JDK 必须是 6 及以上版本。

@Resource 可在属性上,也可在 set 方法上。

1、byType 注入引用类型属性

@Resource 注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入 bean,则会按照类型进行 Bean 的匹配注入。

举例:

2、byName 注入引用类型属性

@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id。

举例:

Bean 的生命始末@PostConstruct 与@PreDestroy

在方法上使用@PostConstruct 与原来的 init-method 等效。在方法上使用@PreDestroy,与 destroy-method 等效。

举例:

注解与 XML 的对比

注解优点是:

● 方便

● 直观

● 高效(代码少,没有配置文件的书写那么复杂)。

其弊端也显而易见:以硬编码的方式写入到Java代码中,修改是需要重新编译代码的。

●  配置和代码是分离的

● 在xml中做修改,无需编译代码,只需重启服务器即可将新的配置加载。

● xml的缺点是:编写麻烦,效率低,大型项目过于复杂。

全部教程