文章目录
- 剑指spring源码(三)
-
- 前言
- 注册BeanPostProcessors
剑指spring源码(三)
前言
在我的spring源码系列文章已经写了注册bd和执行BeanFactory的后置处理器,spring容器到这里干的事情有注册了5个root bd,reader,并且解析了我们配置类appConfig。但是还有很多事情没做,比如注册BeanPostProcessors,实例化单例对象,循环引用等问题。
本文主要写注册BeanPostProcessors的流程。
注册BeanPostProcessors
代码调用如下
refresh()-> //BeanPostProcessors的作用是实例化bean时进行拦截,对bean增强 registerBeanPostProcessors(beanFactory);-> PostProcessorRegistrationDelegate#registerBeanPostProcessors();
注册BeanPostProcessors代码如下
public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { //beanDefinitionNames这个集合中根据类型获取BeanPostProcessor,有两个,都是this这行代码添加进去的 //在我的spring源码一中提到了beanDefinitionNames注册了五个bd,其中就有两个是BeanPostProcessor,这行代码就是这拿出这两个 //org.springframework.context.annotation.internalAutowiredAnnotationProcessor->AutowiredAnnotationBeanPostProcessor.class //org.springframework.context.annotation.internalCommonAnnotationProcessor->CommonAnnotationBeanPostProcessor.class String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); //beanPostProcessors集合有3个元素,这三个元素在哪里添加进去的? 见下面解释 //3+1+2=6 int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); //存放实现PriorityOrdered的BeanPostProcessor List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); //存放实现MergedBeanDefinitionPostProcessor的BeanPostProcessor List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); //实现Ordered的BeanPostProcessor的name List<String> orderedPostProcessorNames = new ArrayList<>(); //all regular BeanPostProcessors name List<String> nonOrderedPostProcessorNames = new ArrayList<>(); //AutowiredAnnotationBeanPostProcessor implements MergedBeanDefinitionPostProcessor,PriorityOrdered //CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor implements MergedBeanDefinitionPostProcessor,PriorityOrdered for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } //priorityOrderedPostProcessors和internalPostProcessors到这里为止都有两个 // First, register the BeanPostProcessors that implement PriorityOrdered. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);//排序 //注册BeanPostProcessors,实际就是添加到beanPostProcessors list集合 registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); //ordered regular的BeanPostProcessors省略 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); //到此为止beanPostProcessors集合的里面的BeanPostProcessor如下 //ApplicationContextAwareProcessor //ApplicationListenerDetector //ImportAwareBeanPostProcessor //AutowiredAnnotationBeanPostProcessor //CommonAnnotationBeanPostProcessor //BeanPostProcessorChecker }
beanPostProcessors集合添加三个元素的地方
位置一:refresh()->prepareBeanFactory(beanFactory);
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
位置二:
refresh()->
invokeBeanFactoryPostProcessors(beanFactory);->
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());->
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);->
ConfigrationClassPostProcessor#postProcessBeanFactory()->
beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory));
这三个元素分别是ApplicationContextAwareProcessor,ApplicationListenerDetector,ImportAwareBeanPostProcessor