Spring 自动注册及自动装配
Spring支持三种注册Bean及装配Bean的方式:
- 显式地在Java代码中注册及装配
- 显示地在Xml文件中注册及装配
- 隐式地装配,即自动注册及装配
这三种方式可以混合使用。选择哪种更多地是看个人品味。
下文主要介绍第三种方式:自动扫描注册Bean及自动装配(Autowiring)Bean(在beans.xml中配置)。
1. <context: annotation-config/>
这个标签会自动向Spring容器注册以下四个BeanPostProcessor, 让系统识别对应的注解从而支持相关的自动装配:
BeanPostProcessor | 对应的注解 |
AutowiredAnnotationBeanPostProcessor | @Autowired |
CommonAnnotationBeanPostProcessor |
@Resource @PostConstruct @PreDestroy |
PersistenceAnnotationBeanPostProcessor |
@PersistenceUnit @PersistenceContext |
RequiredAnnotationBeanPostProcessor | @Required |
传统的注册方式:
1 <bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor"/> 2 <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> 3 <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 4 <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
这个标签只支持自动装配,不支持自动注册(因为不能识别@Component, @Controller, @Service, @Repository;要想识别这四个注解,需要配置<context: component-scan base-package="xxx.xxx"/>标签, 见2。)。
Spring支持以下几种不同的用于自动装配(Autowiring)的注解:
- Spring自带的@Autowired:可用于字段和方法,默认按类型装配,允许null值,如@Autowired(required=false)。
1 @Autowired() 2 @Qualifier("baseDao") 3 private IBaseDao baseDao;
- JSR-250 @Resource:默认按名称装配。
1 @Resource(name="baseDao") 2 private IBaseDao baseDao;
- JSR-300 @Inject
推荐使用@Resource, Java的一部分,减少同Spring的耦合。
2. <context: component-scan base-package="xxx.xxx"/>
这个标签包含了<context: annotation-config/>的功能;既支持自动装配,又支持自动注册。
支持@Component, @Controller, @Service, @Repository, @RestController, @ControllerAdvice, @Configuration注解。
作用:扫描base-package并在application context中注册扫描到的使用了以上注解的beans。
注意:Spring容器默认关闭注解装配。可以使用1或2开启注解装配。
3. <mvc: annotation-driven>
这个标签会自动注册以下bean:
- DefaulAnnotationHandlerMapping
- AnnotationMethodHandlerAdapter
这是Spring MVC为@Controller, @RequestMapping分发请求所必需的。
注意:现在Spring 3.1对@Controller, @RequestMapping两个注解的支持是默认开启的。除非想要获得JSON的支持(Jackson),否则不必声明这个标签。
参考资料:
Difference between <context:annotation-config> vs <context:component-scan>
Spring in Action, 4th Edition