Spring IoC容器之基于注解的配置

spring支持多种配置方式,如XML方式、基于注解方式等。比较常用的是基于注解的方式,它将配置信息移入组件类中,在相关的类、方法或字段上声明并使用注解。

spring提供了很多注解,如@Required、@Autowired、@Resource、@PostConstruct、@PreDestroy、@Inject、@Qualifier、@Named、@Provider等。

基于注解的配置注入会在基于XML配置注入前执行,如果同时使用两种方式,后面的配置会覆盖前面装配的属性。

1、@Required

@Required注解应用于bean属性的setter方法,它只表明受影响的bean的属性必须在bean定义中或自动装配中通过明确的属性值在配置时来填充。如果受影响的bean的属性没有被填充,则容器会抛出异常。示例如下:

2、@Autowired

可以使用@Autowired注解到传统的setter方法中,JSR-330中的@Inject注解可以代替@Autowired。如下:

将注解应用于setter方法  
将注解应用于任意名称或多个参数的方法
将注解应用于构造方法和字段
将注解应用于特定类型bean的期望类型数组字段或方法
将注解应用于特定类型的集合

默认情况下,当出现0个候选bean时,自动装配就会失败。默认的行为是将被注解的方法、构造器和字段作为需要的依赖关系,此行为可以通过如下方式来改变:

设置注解的默认行为

推荐使用@Autowired的required属性,required属性表示属性对于自动装配目的不是必须的,如果不能被自动装配,则属性就会被忽略。@Required注解强制了由容器支持的各种方式的属性配置,相比于required属性它更健壮。

3、@Primary

通过类型的自动装配可能会有多高候选者,当一个依赖有多个候选者bean时,@Primary注解指定了一个优先提供的特殊bean。当多个候选者bean中存在一个明确指定了@Primary的bean时,就会自动装载这个bean。如下:

多个候选者bean中使用@Primary
messageService将使用firstMessage自动注解

4、@Qualifier

@Qualifier注解是另一种可以达成更多控制目的的做法,可以用特定参数来关联限定符的值,缩小类型的集合匹配,特定的bean就为每个参数来选择,示例如下:

用特定参数来关联限定符的值
在独立的构造器参数或方法的参数中来指定

5、@Resource

spring支持使用@Resource注解在字段或bean属性的setter方法上注入。@Resource使用name属性,spring默认解析这个值作为要注入bean的名称。示例如下:

如果没有指定name值,则默认的名称就从字段名称或setter方法中派生出来。若是字段就会用字段名称,若是setter方法就会用bean的属性名称。示例如下:

名称为messageService的bean通过setter方法注入

6、@PostConstruct与@PreDestroy

CommonAnnotationBeanPostProcessor既可以识别@Resource注解,也可以识别JSR-250规范的生命周期注解,如下:

基于注解的配置和基于XML的配置对比

无论选择哪种方式都有利弊,基于注解的配置在生命中提供了大量的上下文,配置过程更加简洁,但它会让配置变得分散且难以控制。而基于XML的方式更擅长装配组件,无须修改源码或重新编译。


--参考文献《Srping5开发大全》

你可能感兴趣的:(Spring IoC容器之基于注解的配置)