Spring 在管理 Bean 时会使用到各种注解 ,本文介绍一下开发中常会用到的注解。
以下是常用DI注解比较:
| DI 常用注解 | 说明 | 用途 |
|---|---|---|
@Autowired |
自动装配,从ApplicationContext中取出 同类型 的bean装配到被注解项上。 | 属性 / setter / 构造器 |
@Qualifier |
因为 @Autowired 按照类型自动装配可能存在多个bean实例,可以用 @Qualifier("beanId") 限定 id 筛选出指定的bean。 xml 中也有qualifier 标签。 |
配合 @AutoWired 使用,限定 id , 但不推荐使用 ,可以直接使用 @Resource 代替。 |
@Resource |
装配资源,默认从ApplicationContext中取出 同名 的bean装配到被注解项上。@Resource 可以通过 byName / byType 两种方式,若不指定默认 byName 匹配装载,找不到按 byType 装载。 |
属性 / setter |
@Required |
表示被修饰属性项,在初始化时一定要配置明确值。 | setter |
@Required
表示被修饰属性项,在初始化时一定要配置明确值。可以用于属性 / setter。
@Autowired
自动装配,从ApplicationContext中取出 同类型 的bean装配到被注解项上。可以用于 属性 / setter / 构造器。
注意事项 :
当没有合适的bean时会抛异常,可以使用
@Autowired(required=false)避免。每个类只有一个构造器可以被标记为
required=true。但 当有必要属性时推荐用@Required。可以注解Spring众所周知的解析依赖性接口,即spring自带bean。
如
BeanFactory,Applicationcontext,Environment,ResourceLoader,ApplicationEventPublisher,MessageSource等。@Autowired不能注解BeanPostProcessor/BeanFactoryPostProcessor,可以使用@Bean代替。因为
@Autowired为BeanPostProcessor处理,会产生循环依赖。可以用来装配List/String的Map等集合,如果希望List有序,可以使用
@Order(n)或使bean实现Ordered接口。
@Qualifier
因为 @Autowired 按照类型自动装配可能存在多个bean实例,可以用 @Qualifier("beanId") 限定 id 筛选出指定的bean。 xml 中也有qualifier标签 。配合 @AutoWired 使用,限定 id , 但 不推荐使用 ,可以直接使用 @Resource 代替。
和
@Component一样,可以用作元注解,自定义限定注解。即使不使用
@Qualifier作注解依然可以注册自己的qualifier注解类型。1
2
3
4
5
6
7
8<bean id="customAutowireConfigurer"
class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">
<property name="customQualifierTypes">
<set>
<value>example.CustomQualifier</value>
</set>
</property>
</bean>
@Resource
JSR-250标准的注解,在Java EE 5/6通用,spring同样支持。
装配资源,默认从ApplicationContext中取出 同名 的bean装配到被注解项上。用于属性/只有一个多参数 setter
其实
@Resource可以通过byName/byType两种方式,只是一般使用默认byName匹配装载。
注意事项 :
集合/Map类型很多都无法通过类型直接匹配, 即
@Autowired不可使用。此时可以使用唯一名称id进行匹配。使用
name属性可以指定被注入bean的名称,默认是属性的名称或setter名称之后,会由
ApplicationContext中的CommonAnnotationBeanPostProcessor发现并处理。当
CommonAnnotationBeanPostProcessor在ApplicationContext中注册,不仅能识别JSR-250的@Resource,还支持Spring2.5引入的用于初始化回调/销毁回调的@PostConstruct/@PreDestroy。
@Bean
基于java的容器注解,配置和初始化一个由SpringIoc容器管理的新对象的方法,类似于 xml 配置中的 <bean></bean> 。通常配合 @Configuration 使用。
以下的 java 配置 和 xml配置 等效。
1 |
|
1 | <beans> |
可以使用 @Scope 注解控制作用域和代理方式。
1 |
|
注意事项 :
@Bean的name默认是方法名,也可以使用@Bean("Demo")自定义bean名称。可以使用
@Bean(initMethod="init")和@Bean(destroyMethod="cleanup")指定初始化和销毁bean的方法(一般在return的类中定义相关方法)。基于泛型的自动装配(//TODO)
@Bean和@Autowired配合可以实现泛型的自动装配。
@Inject / @Name
从 Spring3.0 开始支持 JSR330 标准注解(依赖注入注解),其扫描方式与Spring注解一致。
需要以下依赖:
1 | <dependency> |
- @Inject
@Inject等效于@Autowired,可以用作类,属性,方法,构造器。
- @Name
- 可以表示bean,和
@Component等效。 - 可以限制依赖注入的bean名称,和
@Resource等效。
- 可以表示bean,和