ConfigurationClassPostProcessor
ConfigurationClassPostProcessor类为一个beanFactory后置处理其, 其中主要用以解析添加了@Configuration, @Component, @ComponentScan, @Import, @ImportResource, @Bean注解对应的类以及方法, 其整体解析流程如下:
注解解释
@Configuration
应用了@Configuration的类, 为配置类, 其可等同于xml配置, 其对应势力将会被创建CGlib代理类,以确保通过该配置类定义的bean实力在IOC容器中为单例或者与之定义的scope对应
@Component
应用了@Component的类, 可理解为组件类, 其中应用@service, @Controller注解的类,都可理解为组件类, 在解析@Component时, 会解析其类中的子类,是否被有应用配置注解
@ComponentScan
@ComponentScan定义类包名, 会解析对应定义包下中所有符合ClassPathBeanDefinitionScanner中includeFilters定义的所有类,并创建BeanDefinition
@Import
@Import中需要设置对应import类, AOP实现中@EnableAspectJAutoProxy中@Import对应的import类为AspectJAutoProxyRegistrar, 在事物中@EnableTransactionManagement中@Import对应的import类为TransactionManagementConfigurationSelector,解析如下:
- 若import类实现了ImportSelector接口, 则执行对应selectImports()方法获取其他import类;
- 若inport类实现ImportBeanDefinitionRegistrar接口, 则实例化对应对象, 并添加到configClass的importBeanDefinitionRegistrars属性中,其后通过ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars()方法执行对应registerBeanDefinitions()方法;
- 其他情况,则作为配置类, 递归进行解析;
@ImportResource
其入参为资源文件地址, 可以为xml, groovy配置文件, 在JavaConfig以及SpringBoot中,可通过该注解加载xml配置文件
@Bean
@Bean注解应用在方法中, 对应方法将会构造BeanMethod并存储在configClass类beanMethods属性中,其后通过ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod()创建对应BeanDefinition对象,