Spring源码之ApplicationContext(六)注册BeanPostProcessor
2016-03-21 23:42
666 查看
接下来我们继续探索registerBeanPostProcessors的用法。这里需要注意的是,注册拦截Bean创建的Bean处理器,这里只是注册,真正的调用是在getBean时候。(相关资源可到这里下载:http://pan.baidu.com/s/1sjSo9a9)
在函数的调用中,可能读者会认为对于internalPostProcessons中存储的后处理器也是MergedBeanDefinitionPostProcessor类型的处理器,在代码中似乎是被重复调用了,其实是不然,我们可以看registerBeanPostProcessor方法的实现。
1. PostProcessorRegistrationDelegate
在AbstractApplicationContext类中,调用函数registerBeanPostProcessors,而这个函数又调用了类PostProcessorRegistrationDelegate中的registerBeanPostProcessors这个函数。所以我们的重心就是在这里分析了。public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); // Register BeanPostProcessorChecker that logs an info message when // a bean is created during BeanPostProcessor instantiation, i.e. when // a bean is not eligible for getting processed by all BeanPostProcessors. //BeanPostProcessorChecker是一个普通的信息打印,可能会有些情况 //当Spring的配置中的后处理器还没有被注册就已经开始了bean的初始化 //便会打印出BeanPostProcessorChecker中设定的信息。 int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); // Separate between BeanPostProcessors that implement PriorityOrdered, // Ordered, and the rest. //使用PtiorityOrdered保证顺序 List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>(); List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>(); //使用Ordered保证顺序 List<String> orderedPostProcessorNames = new ArrayList<String>(); //无序BeanPostProcessor List<String> nonOrderedPostProcessorNames = new ArrayList<String>(); 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); } } // First, register the BeanPostProcessors that implement PriorityOrdered. sortPostProcessors(beanFactory, priorityOrderedPostProcessors); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // Next, register the BeanPostProcessors that implement Ordered. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>(); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } sortPostProcessors(beanFactory, orderedPostProcessors); registerBeanPostProcessors(beanFactory, orderedPostProcessors); // Now, register all regular BeanPostProcessors. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>(); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); // Finally, re-register all internal BeanPostProcessors. sortPostProcessors(beanFactory, internalPostProcessors); registerBeanPostProcessors(beanFactory, internalPostProcessors); beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }
在函数的调用中,可能读者会认为对于internalPostProcessons中存储的后处理器也是MergedBeanDefinitionPostProcessor类型的处理器,在代码中似乎是被重复调用了,其实是不然,我们可以看registerBeanPostProcessor方法的实现。
private static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) { for (BeanPostProcessor postProcessor : postProcessors) { beanFactory.addBeanPostProcessor(postProcessor); } }
2. AbstractBeanFactory
我们通过最后的registerBeanPostProcessors的函数并没有得不到我们提出的疑问,别急,我们继续看一下addBeanPostProcessor的函数。分析一个问题的答案就出来了。public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null"); this.beanPostProcessors.remove(beanPostProcessor); this.beanPostProcessors.add(beanPostProcessor); if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) { this.hasInstantiationAwareBeanPostProcessors = true; } if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) { this.hasDestructionAwareBeanPostProcessors = true; } }
相关文章推荐
- Objective-C探究alloc方法的实现
- cocos2dx三种定时器的使用
- Objective-C语法之代码块(block)的使用
- Android中Fragment中使用Intent
- Spring源码之ApplicationContext(五)激活BeanFactory
- Android Smart Image View
- Android学习之友盟开发这些坑
- Android群英传笔记——第五章:Android Scroll分析
- Android群英传笔记——第五章:Android Scroll分析
- Spring源码之ApplicationContext(四)功能补充
- Android课程---Activity的跳转与传值(转自网上)
- android studio单元测试
- android--Activity有返回值的跳转
- Scala 小程序记录(学习期间的代码片段)
- Android Studio开发环境的配置
- android一连串图片组成动画
- Android课程---Activity中保存和恢复用户状态
- Objective-C语法之代码块(block)的使用
- android判断是否禁用了录音权限
- android笔记——android studio环境搭建