spring注解之<context:component-scan/>标签的解析

  • 在我们使用Spring的时候,基本上很少使用标签配置的方式来声明bean了,都是使用注解的方式来声明bean,在使用注解之前,我们要首先配置一下<context:component-scan/>标签。

<context:component-scan/>标签解析

  • 对应的NamespaceHandler实现类为ContextNamespaceHandler
    • 初始化的解析器为ComponentScanBeanDefinitionParser


      image.png

ComponentScanBeanDefinitionParser解析器

  • ComponentScanBeanDefinitionParser解析器在Spring 初始化解析xml文件时,会执行其parse方法(方法如下图)。
    • 1、确定需要扫描的包路径
    • 2、创建扫描类ClassPathBeanDefinitionScanner
    • 3、扫描包路径下的class文件
    • 4、注册一些注解相关的PostProcessor,并且注册BeanDefinition后的事件通知。


      image.png
image.png
  • 获取annotation-config属性,默认为true
  • 如果annotation-config属性为true,注册一些注解相关的PostProcessor
image.png
  • ConfigurationClassPostProcessor
    • 对@Configuration、@Bean、@Import、@Component、@ComponentScan、@ImportResource等注解的支持
  • AutowiredAnnotationBeanPostProcessor
    • 对@Autowire和@Value注解的支持
  • RequiredAnnotationBeanPostProcessor
    • 对@Required注解的支持
  • CommonAnnotationBeanPostProcessor
  • 对@Resource、@PostConstruct、@PreDestroy注解的支持

*注意:这里注册了一些PostProcessor,用于对各种注解的支持,这里只是注册了处理器,并不会真正的解析注解,我们已经知道BeanFactoryPostProcessor和BeanPostProcessor的作用,AutowiredAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor都实现了BeanPostProcessor,所以会在bean创建的期间被调用,而ConfigurationClassPostProcessor实现了BeanFactoryPostProcessor,所以它会在bean创建之前被调用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容