- 在我们使用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
- 获取annotation-config属性,默认为true
- 如果annotation-config属性为true,注册一些注解相关的PostProcessor
- 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创建之前被调用。
网友评论