Spring 自动注册及自动装配

Spring支持三种注册Bean及装配Bean的方式:

  1. 显式地在Java代码中注册及装配
  2. 显示地在Xml文件中注册及装配
  3. 隐式地装配,即自动注册及装配

这三种方式可以混合使用。选择哪种更多地是看个人品味。

下文主要介绍第三种方式:自动扫描注册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

 

posted @ 2018-01-03 14:51  赫尔修斯  阅读(1121)  评论(0编辑  收藏  举报