spring源码学习笔记-初始化(三) registerBeanPostProcessors
2012-05-31 15:29
567 查看
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源码学习之: 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors
- spring boot学习笔记4-bean的初始化
- [spring源码学习]五-BeanPostProcessor的使用
- spring源码学习笔记-初始化(五)-MessageSource/事件监听器
- spring源码学习笔记-初始化(三)-BeanFactory
- spring源码学习 - 配置文件bean的初始化
- spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
- Spring源码解析笔记9——容器的功能扩展BeanFactory的后处理(BeanFactoryPostProcessor)
- spring源码学习之路---IOC容器初始化要义之bean定义载入
- spring源码学习笔记-初始化(六)-完成及异常处理
- spring源码学习笔记-初始化(四)-PostProcessor
- [spring源码学习]四、IOC源码——普通bean初始化
- Spring源码学习--BeanFactoryPostProcessor
- Spring源码学习--BeanPostProcessor
- spring源码学习笔记-初始化(五)-MessageSource/事件监听器
- Spring源码学习--Bean对象变量初始化(三)
- Spring学习笔记 关于Bean属性的初始化 - 使用inner bean以及List, Map与Set的初始化
- Spring源码解析笔记7——bean的初始化
- spring源码学习笔记-初始化(二) PostProcessor