<context:annotation-config />和<context:component-scan />的异同


一、<context:annotation-config />和<context:component-scan />的异同

  1. 共同点

    扫描注解,替代 get/set 方法,完成自动注入

  2. 不同点

    <context:annotation-config />: 只扫描注解,不负责创建javabean;只有当自己在xml中手动配置bean后,手动创建的bean已经被注册到spring容器里,才能实现自动注入;对于没有在spring容器中注册的bean,它并不能执行任何操作。单纯使用< context:annotation-config/>对@Component、@Controller、@Service这些注解无效,不能激活!

    <context:component-scan base-package=url /> :可以自动将base-package配置包及其递归子包下的类自动创建bean并注册到spring容器中,还能扫描注解,扫描到需要装配的节点时,代替get/set方法自动注入到所需类的属性中。还具有自动将带有@component、@service、@Repository等注解的对象注册到spring容器中的功能。

注:

配置了 <context:annotation-config /> 或 <context:component-scan /> 后,系统之所以能够识别相应的注解,是因为此配置隐式的向 Spring 容器注册了以下4个BeanPostProcessor:

  • AutowiredAnnotationBeanPostProcessor
  • CommonAnnotationBeanPostProcessor
  • PersistenceAnnotationBeanPostProcessor
  • RequiredAnnotationBeanPostProcessor

如果手动配置,如下:

@Autowired

<bean class=   "org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"
/>

@ Resource 、@ PostConstruct、@ PreDestroy

<bean class=
"org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor"
/>

@PersistenceContext

<bean class=         "org.springframework.beans.factory.annotation.PersistenceAnnotationBeanPostProcessor"
/>

@Required

<bean class= "org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"
/>

思考

  1. 如果同时使用这两个配置会不会出现重复注入的情况呢?

    答案:因为 < context:annotation-config /> 和 < context:component-scan> 同时存在的时候,前者会被忽略。如 @Autowire、@Resource 等注入注解只会被注入一次。

声明:格子书格|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - <context:annotation-config />和<context:component-scan />的异同


分享生活,留住感动