SpringIOC加载过程-invokeBeanFactoryPostProcessors
2021-12-12 15:22:49 38 举报
SpringIOC加载过程-invokeBeanFactoryPostProcessors
作者其他创作
大纲/内容
加载已注册的Bean定义后置处理器,即之前注册的 this.reader = new AnnotatedBeanDefinitionReader(this)从里面找到实现了 b style=\
循环我们传递进来的BeanFactoryPostProcessor ,前面已经解释了,一般情况下都是NULL,如果有拿到后分类加入到上面的两个集合如果实现了BeanDefinitionRegistryPostProcessor接口会先调用调用作为postProcessBeanDefinitionRegistry()处理器的后置方法
解析属性资源文件@PropertySource
currentRegistryProcessors.clear()
解析@ImportResource
正常情况肯定是实现的
未被调用且实现了Ordered接口的
各种注解、配置、xml标注的单例Bean都被解析
invokeBeanDefinitionRegistryPostProcessors
font color=\"#f44336\
currentRegistryProcessors.add()
接上 Spring 源码脑图
多轮循环-排序-add-调用
当前的beanFactory是否实现了BeanDefinitionRegistryif (beanFactory instanceof BeanDefinitionRegistry)
此处会解析加了@Configuration的类、@ComponentScan(s)扫描的类、@Import、@Bean等注解的类
第一个For循环
ConfigurationClsasPostProcessorpostProcessor.postProcessBeanDefinitionRegistry(registry)
前面已经解释了调用添加了font color=\"#f44336\
true
定义了两个List:① regularPostProcessors,用来装载BeanFactoryPostProcessor,只有一个实现方法postProcessBeanFactory()② registryProcessors, 用来装载 BeanDefinitionRegistryPostProcessor,它继承了 BeanFactoryPostProcessor 不仅有postProcessBeanFactory()还有postProcessBeanDefinitionRegistry()
如果有条件注解解析 @Conditional
invokeBeanFactoryPostProcessors(beanFactory)
调用结束后 BeanDefinitionMap 中 beanDefinition 情况
执行到此处时已经是这个样子了--因为示例简单没有这些其他的
接下来我们的另一个List : registryProcessors 将发挥作用
实例化的bean
没有实现任何的优先级接口的
解析@ComponentScan
了解后面的内容前先需要知道的:之前已经了解过 BeanDefinition 的两个扩展点 postProcessBeanFactory 和 postProcessBeanDefinitionRegistry 前者是可以修改 BeanDefinition,后者可以多添加 BeanDefinition
首先定义一个Set后续会根据这个集合来判断处理器是否已经被执行过了请记住这个对象:Set<String> processedBeans = new HashSet<>()
循环postProcessorNames,判断是否实现PriorityOrdered接口,调用下面的方法后(创建Bean)加入到 processedBeans 集合currentRegistryProcessors.add(beanFactory.getBeanfont color=\"#9c27b0\
解析@Bean
多轮循环-add-调用Bean工厂的后置处理器
解析@Import
false
list.clear()只清除对象的引用
调用BeanDefinitionRegistryPostProcessorfont color=\"#ff9800\
从 registryProcessors 取出实现了 PriorityOrdered、Ordered、没有实现任何优先级接口的 BeanFactoryPostProcessor,分别按顺序调用font color=\"#f44336\
开始执行方法前 BeanDefinitionMap 中 beanDefinition 情况
解析@ComponentScans
第二个For循环
ConfigurationClsasPostProcessor 解析Bean定义processConfigBeanDefinitions(registry)
0 条评论
下一页