Spring Bean 的注入可以使用xml配置或者使用注解的形式来完成,其中注解是现在开发的主流,本文就以注解的形式对Bean装配进行简单的总结。

1.注解的优势

注解和xml各有个的优势,xml可以清晰看出依赖的关系,但是bean过多导致配置过多,注解申明在代码,使其更加简单和简洁。
添加注解申明在xml文件,通常我们添加如下的代码:

context:annotation-config/

此隐式注解重在申明AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,
RequiredAnnotationBeanPostProcessor.注册这4个 BeanPostProcessor的作用,系统能够识别相应的注解。

2.@Required

此注解拥有bean属性setter方法,设置之后表示此属性必须设置,如果没有则抛出BeanInitializationException异常

3.@Autowired

可以用于属性,方法,构造器为其装配bean.
属性上面:

1
2
3
@Autowired
private AssemblyDAO assemblyDAO ;

setter方法

1
2
3
4
5
@Autowired
public void setAssemblyDAO(AssemblyDAO assemblyDAO) {
this.assemblyDAO = assemblyDAO;
}

构造器:

1
2
3
4
5
@Autowired
public AssemblyServiceImpl(AssemblyDAO assemblyDAO){
this.assemblyDAO = assemblyDAO ;
}

a)同时也可以根据上下文将所有同类型的bean收集到集合,数组当中

1
2
3
4
5
@Autowired
private AssemblyDAO [] assemblyDAOs ;
@Autowired
private List<AssemblyDAO> assemblyDAOs ;

还可以装配到map<String, Object>当中去,其中string为bean的名字

1
2
@Autowired
private Map<String, AssemblyDAO> assemblyDAOMaps ;

在Autowired接口中有且只有一个方法 required(),其默认为true.在注入找不到对应的Bean就会抛出BeanCreationException异常,如果设置@Autowired(required=false),当在当前容器找不到对应的bean也不会抛错。

@Autowired 还可以用来注入Spring提供的依赖的接口BeanFactory, ApplicationContext, Environment, ResourceLoader, ApplicationEventPublisher, and MessageSource,扩展接口ConfigurableApplicationContext or ResourcePatternResolver

注意:@Autowired 是由BeanPostProcessor实现过来的,所有在BeanPostProcessor or BeanFactoryPostProcessor 这些中不能使用,使用会出现循环死。在这些类中可以通过xml配置实现注入或者使用Spring @Bean。

4.@Qualifier

当一个接口被多个类继续的时候,我们为借口自动注入值的时候就会出现BeanCreationException异常,因为存在多个Bean,spring并不难知道应该注入那个一个Bean,这个时候就可以使用@Qualifier注解,为其需要的注入对应的bean 名字

1
2
3
4
@Autowired
@Qualifier("assemblyDAOImpl")
private AssemblyDAO assemblyDAO ;

同样@Qualifier注解也可以用于方法和构造器上面:

1
2
3
4
5
@Autowired
public AssemblyServiceImpl(@Qualifier("assemblyDAOImpl") AssemblyDAO assemblyDAO){
this.assemblyDAO = assemblyDAO ;
}

a)在xml配置中为bean设置Qualifier 名字方法:

1
2
3
4
<bean class="example.SimpleMovieCatalog">
<qualifier value="main"/>
</bean>

b)自定义Qualifier
通过 文章查看自定义Qualifier的使用和效果

5.@Bean
@Bean 通常和@Configuration搭配一起使用,@Configuration等价于xml整体配置文件,@Bean 类似于为其中的bean

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class MyConfiguration {
@Bean
public StringStore stringStore() {
return new StringStore();
}
@Bean
public IntegerStore integerStore() {
return new IntegerStore();
}
}

本类中分别配置了两个Bean,bean的id 默认是方法名称。

6.@Resource

Spring 同样支持JSR-250,可以使用@Resource为其字段和stter方法注入.
@Resource 注解方法在JSR250的包中,使用在使用的时候需要添加相应的jar包,maven依赖添加如下:

1
2
3
4
5
6
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>

在setter方法中使用:

1
2
3
4
5
@Resource
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}

在属性上:

1
2
@Resource
private MovieFinder movieFinder ;

7.@PostConstruct 和 @PreDestroy

在JSR-250的标准中,@PostConstruct 用于Bean的初始化执行,@PreDestroy在bean销毁的时候执行。

8.@Inject

@Inject 属于java上下文依赖注入,所有在使用@Inject还需要一如另外jar包,maven配置如下:

1
2
3
4
5
6
<dependency>
<groupId>javax.inject</groupId>
<artifactId>inject</artifactId>
<version>1.0</version>
</dependency>

在属性上使用:

1
2
@Inject
private InjectionDAO injectionDAO ;

当然@Inject也可以用在方法上面。