ConfigurationClassPostProcessor会处理所有BeanDefinition中的符合注解条件的BeanDefinition,(@Configuration注解的、@Component、@ComponentScan、@Import、@ImportResource或者@Bean注解的),使用ConfigurationClassParser解析出javaconfig配置类,使用ConfigurationClassBeanDefinitionReader加载。
先来提个问题:
相信很多同学出去面试,都会被问到一个问题:
请说一下spring boot的自动装配原理?
相信大部分同学是这样回答的:
1 首先找到spring boot启动类:找到注解SpringBootApplication
2 点注解进去找到:这三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
3 最关键是看注解:@EnableAutoConfiguration,继续点注解进去,找到
4 点Import导入的AutoConfigurationImportSelector.class,继续进去
5 找到方法:getCandidateConfigurations,点击里面的方法:getSpringFactoriesLoaderFactoryClass
6 找到EnableAutoConfiguration.class类
7 找到如下图:可以看到通过EnableAutoConfiguration类自动导入了spring boot所有需要的类
如果是这样回答的,也不能完全算错误,只是一上来就说通过找注解这样找到的,实在有点勉强,下面我们来分析ConfigurationClassPostProcessor后置处理器的处理,来揭开这个原理。
1 先找到启动类,进入run方法
2 一直找到refreshContext方法
3 继续找到refresh方法,进入到invokeBeanFactoryPostProcessors方法
4 进入到了类:ConfigurationClassPostProcessor 的方法postProcessBeanDefinitionRegistry
走到解析的方法parse
5 进入到getImports方法
6 到这里就可以看到引入解析出来的
7 再具体来看import注解的解析
8 来看process方法
进入方法getImport
再进入process方法
终于进入到了关键
终于到了方法:getCandidateConfigurations
先来看方法getSpringFactoriesLoaderFactoryClass
获取到了自动装配类:EnableAutoConfiguration
继续加载
到这个目录加载:META-INF/spring.factories
最后加载到了自动装配类下面所有的类
最终的效果是不是一模一样
下面我们具体来看下:ConfigurationClassPostProcessor解析
先在xml中打开扫描配置:
在类中添加一个注解:
测试类:
1 进入到:
先进入到ConfigurationClassPostProcessor类的postProcessBeanDefinitionRegistry方法,因为ConfigurationClassPostProcessor实现了接口:BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor接口:
继续执行:
检查是否候选者:
再到解析方法
终于进入到了方法 doProcessConfigurationClass,真正解析@Component、@PropertySources、@ComponentScan、@ImportResource、@Import、@Bean注解的
后续在spring boot的时候,再详细聊这一块