spring源码解读(二)spring配置类扫描beanDefinition注入
本次主要记录spring将bean定义扫描进spring容器的过程
1 进入到invokeBeanFactoryPostProcessors方法内
上图中的beanFactoryPostProcessors是在容器还未扫描的时候里面是否存在beanFactoryPostProcessors,一般为空,(程序员可手动添加,但是一般不会这样干)
这一行会从bd中拿到继承了BeanDefinitionRegistryPostProcessor接口的bd名字,拿出一个,org.springframework.context.annotation.internalConfigurationAnnotationProcessor。(bd现在有6个,5个是spring自己注入的bd,还有一个我们自己注入的App的bd)
int var10;
String ppName;
for(var10 = 0; var10 < var9; ++var10) {
ppName = var16[var10];
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { //ConfigurationClassPostProcessor 这个类是实现了PriorityOrdered接口
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); //通过getBean初始化bean,具体过程留在后面,这里我们发现ConfigurationClassPostProcessor
//的对象被加进了beanFactory的单列池,现在单列池有四个bean
processedBeans.add(ppName); //添加进集合
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory); //如果上一步有多个实现了BeanDefinitionRegistryPostProcessor, PriorityOrdered借口的bean,这里会进行排序,一般一个
registryProcessors.addAll(currentRegistryProcessors); // 添加进集合
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); //执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
currentRegistryProcessors.clear();
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
var16 = postProcessorNames;
var9 = postProcessorNames.length;
单列池现有4个bean
进入到BeanDefinitionRegistryPostProcessor具体实现类ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法里面