解析配置类流程
2020-09-23 15:09:15 90 举报
解析配置类流程
作者其他创作
大纲/内容
将配置类中@Bean的方法解析成方法元数据放到配置类中
准备工作,给DefaultListableBeanFactory加点料
调用所有后置处理器的postProcessBeanFactory方法
AbstractApplicationContext#prepareBeanFactory
这里会解析配置类以及处理解析配置类后所引入的所有BeanFactoryPostProcessor
解析配置类
ConfigurationClassParser#doProcessConfigurationClass
ConfigurationClassPostProcessor#postProcessBeanFactory
componentScanParser.parse
......
//处理PropertySources注解processPropertySource(propertySource)
实例化一个配置类解析器
this.reader.loadBeanDefinitions(configClasses)
通知子类刷新BeanFactory
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this))
//放置常规的后置处理器,就是只实现了BeanFactoryPostProcessor接口的List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>()//放置实现了BeanDefinitionRegistryPostProcessor接口的, //之前我们注册的后置处理器中只有ConfigurationClassPostProcessor实现了List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>()//放置当前的RegistryProcessorsList<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>()
ConfigurationClassPostProcessor中会将配置类进行动态代理
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
retrieveBeanMethodMetadata
添加一个ApplicationContextAwareProcessor,用于bean初始化前调用一系列的Aware接口回调
检查是否为配置类
注册上一步解析出来的所有的BeanPostProcessor
/** * 将配置类进行动态代理,这样@Bean中依赖其他的Bean就可以从容器中拿bean了 * example: * @Bean * public Car car(){ * return new Car(wheel()); * } * @Bean * public Wheel wheel(){ * return new Wheel(); * } * 如果配置类不换成动态代理的话,每次从容器中拿car都将new一个wheel * */
refresh
invokeBeanFactoryPostProcessors(beanFactory)
//这里只有full类型的配置类才会生成代理类,lite类型的不会//所以lite类型的配置类每次获取car都会生成一个wheelenhanceConfigurationClasses(beanFactory)
//添加一个beanPostProcessorbeanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory))
prepareRefresh
registerBeanPostProcessors(beanFactory)
postProcessBeanFactory(beanFactory)
将@ComponentScan引入的所有类扫描成BeanDefinition并注册到容器中
obtainFreshBeanFactory
//检查是否是有@Configuration注解的BeanDifinition -> full类型的配置类 -> 会把配置类替换成动态代理类\t\t\t//或者该类包含@Component @ComponentScan @Import @ImportResource @Bean 注解的其中之一 -> lite类型的配置类 -> 不会替换成动态代理类
创建三个存放后置处理器的集合
将配置类的beanDefinition放到候选配置类的集合中
parser.parse(candidates)
AbstractApplicationContext#refresh
prepareBeanFactory(beanFactory)
留于子类调用的扩展方法
处理@Import导入的beanDefintion和配置类中的@Bean
启动前的准备工作
调用实现BeanFactoryPostProcessor的后置处理器
ConfigurationClassPostProcessor#processConfigBeanDefinitions
processImports
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this))
@ImportResource
处理@Import注解
调用ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法
0 条评论
回复 删除
下一页