spring源码学习笔记-初始化(三) registerBeanPostProcessors
来源:互联网 发布:android 高仿微信源码 编辑:程序博客网 时间:2024/05/16 07:10
refresh 方法如下:
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
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.int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Separate between BeanPostProcessors that implement PriorityOrdered,// Ordered, and the rest.List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();List<String> orderedPostProcessorNames = new ArrayList<String>();List<String> nonOrderedPostProcessorNames = new ArrayList<String>();for (String ppName : postProcessorNames) {if (isTypeMatch(ppName, PriorityOrdered.class)) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}else if (isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {nonOrderedPostProcessorNames.add(ppName);}}// First, register the BeanPostProcessors that implement PriorityOrdered.OrderComparator.sort(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);}}OrderComparator.sort(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.OrderComparator.sort(internalPostProcessors);registerBeanPostProcessors(beanFactory, internalPostProcessors);beanFactory.addBeanPostProcessor(new ApplicationListenerDetector());
分析:
第1行代码通过传递过来的beanfactory查找类型为BeanPostProcessor的bean的名字;
第6行代码获得类型为BeanPostProcessor的bean数量+1+类型为beanPostProcessor的bean的长度; (+1表示下面beanProcessorChecker)
第7行代码为beanFactory注册一个BeanPostPossorChecker类,这个类的作用当一个bean没有被所有的beanPostProcessor处理后打印一行info日志。
第11行代码开始主要是区别对待继承ProiorityOrdered接口,排序并且设置;这里声明一个BeanPostProcesor的ArrayList;
第12行代码声明一个存放内部的BeanPostProcessor的List;
第13行代码声明一个存放排序BeanPostProcessor的Name的List;
第14行代码声明一个存放非排序的BeanPostProcessor的name的List;
第15行代码开始的for循环,循环BeanPostProcessor的Name,如果是匹配PriorityOrdered接口,进入if,否则如果是实习Ordered接口
执行else if,
- spring源码学习笔记-初始化(三) registerBeanPostProcessors
- spring源码学习笔记-初始化(三)-BeanFactory
- spring源码学习笔记-初始化(三)-BeanFactory
- spring源码学习笔记-初始化(三)-BeanFactory
- spring源码学习笔记-初始化(4)
- Spring源码学习--Bean对象变量初始化(三)
- spring源码学习笔记-初始化(一)-概览
- spring源码学习笔记-初始化(二)-BeanFactory
- spring源码学习笔记-初始化(四)-PostProcessor
- spring源码学习笔记-初始化(五)-MessageSource/事件监听器
- spring源码学习笔记-初始化(二) PostProcessor
- spring源码学习笔记-初始化(六) ClassPathXmlApplicationContext
- spring源码学习笔记-初始化(一)-概览
- spring源码学习笔记-初始化(二)-BeanFactory
- spring源码学习笔记-初始化(四)-PostProcessor
- spring源码学习笔记-初始化(五)-MessageSource/事件监听器
- spring源码学习笔记-初始化(一)-概览
- spring源码学习笔记-初始化(二)-BeanFactory
- MySQL优化
- listView的异步加载
- Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用 .
- hibernate调用存储过程,有输出参数
- 关于CCV1.3源码的调试
- spring源码学习笔记-初始化(三) registerBeanPostProcessors
- VM ESXI 外网访问端口号443
- JavaScript js 左右移动下拉列表选项
- 结构体的相互嵌套
- 用ModalViewController切换View
- OpenGL API分类
- 昨天做了一个自定义标签
- C++ primer第二次阅读学习笔记(第18章:特殊工具与技术:运行时类型识别、extern。。。)
- sd_fusing.sh注释