ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor,所以他是BeanFactory的后置处理器的一种,也是十分重要的一个BeanFactory的后置处理器。咱们看看他到底做了哪些事件。
BeanFactoryPostProcessor的流程程序咱们曾经讲过了,咱们当初从ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry办法开始看。
这个办法有两个事件,一个是registriesPostProcessed增加了registryId,这个是前面用于postProcessBeanFactory办法中判断是否曾经执行了processConfigBeanDefinitions办法。这里必定会执行,所以postProcessBeanFactory办法就不再执行。
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { // 其余略 this.registriesPostProcessed.add(registryId); processConfigBeanDefinitions(registry);}
processConfigBeanDefinitions办法是比拟外围的办法,我这里就不贴很多代码,通过流程图的形式解说这里做了什么。具体的例子参考之前的文章spring学习之bean的定义。
@Configuration
首先,他会获取@Configuration注解,他实际上是继承了@Component。而后再解析@Configuration类中的其余注解。所以咱们常常在类上写的@Configuration之所以会注入到容器中,就是这里被解析的。
解析的过程是在ConfigurationClassParser的parser办法中,解析的后果存入BeanDefinition。parser最初调用比拟重要的办法是doProcessConfigurationClass。
@Conditional
doProcessConfigurationClass办法是在processConfigurationClass办法中调用的,processConfigurationClass办法中有一个比拟重要的注解判断,@Conditional,用于判断是否存入BeanDefinition。咱们罕用的@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnClass、@ConditionalOnMissingClass、@Conditional等就是ConditionEvaluator#shouldSkip办法来判断的,如果符合条件,才能够解析上面的几个注解。
@PropertySource
咱们须要引入资源配置文件的时候,常常用以下的写法,他能被注入到各个属性,就是在doProcessConfigurationClass这个办法中实现的。
@Configuration@PropertySource("classpath:***.properties")public class XXXConfig { }
@ComponentScans和@ComponentScan
这两个注解的basePackages上面的类,就是这里在这里扫描,因为可能扫描的类中,也有这两个注解,所以这个办法里会通过递归调用parse办法。
Import
spring学习之bean的定义
在这里演示了import的三种形式,包含@Import注解、实现ImportBeanDefinitionRegistrar接口、实现ImportSelector。这三种为什么能被注入容器,就是在ConfigurationClassParser的processImports办法解析。
首先是解析ImportSelector接口,而后是ImportBeanDefinitionRegistrar接口,最初是
@Import注解。
@ImportResource
当咱们须要引入其余的spring配置文件时,咱们会用@ImportResource注解,也是在这里解析的。
@ImportResource({ "classpath *:XXX.xml"})public class MyConfig {}
@Bean
最初是@Bean,咱们在代码里注入的bean的定义。
所以ConfigurationClassPostProcessor其实做了很多事件,下面几个注解会把解析后的信息退出到BeanDefinition,前面getBean的时候,就会调用这里BeanDefinition的内容。