registerBeanPostProcessors(beanFactory)解析
找到所有的BeanPostProcessors接口的实现类,并且注册到spring容器中,同时会真正实例化BeanPostProcessors接口的实现类
1 流程和之前的invokeBeanFactoryPostProcessors()类似 2 这个方法会处理开发人员自己实现的BeanPostProcessor,也会处理spring内部实现的BeanPostProcessor 3 AutowiredAnnotationBeanPostProcessor:处理@Autowired 4 RequiredAnnotationBeanPostProcessor:处理@Required 5 CommonAnnotationBeanPostProcessor :处理@RreDestory@PostConstruct @Resource
AnnotationAwareAspectJAutoProxyCreator:处理AOP 6 public static void registerBeanPostProcessors( 7 ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { 8 9 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); 10 11 // Register BeanPostProcessorChecker that logs an info message when 12 // a bean is created during BeanPostProcessor instantiation, i.e. when 13 // a bean is not eligible for getting processed by all BeanPostProcessors. 14 int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; 15 beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); 16 17 // Separate between BeanPostProcessors that implement PriorityOrdered, 18 // Ordered, and the rest. 19 List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); 20 List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); 21 List<String> orderedPostProcessorNames = new ArrayList<>(); 22 List<String> nonOrderedPostProcessorNames = new ArrayList<>(); 23 for (String ppName : postProcessorNames) { 24 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { 25 //这里的getBean会实例化BeanPostProcessor的实现类,其他bean(lazy!=true并且没有被使用的)的实例化在最后 26 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); 27 priorityOrderedPostProcessors.add(pp); 28 if (pp instanceof MergedBeanDefinitionPostProcessor) { 29 internalPostProcessors.add(pp); 30 } 31 } 32 else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { 33 orderedPostProcessorNames.add(ppName); 34 } 35 else { 36 nonOrderedPostProcessorNames.add(ppName); 37 } 38 } 39 40 // First, register the BeanPostProcessors that implement PriorityOrdered. 41 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); 42 registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); 43 44 // Next, register the BeanPostProcessors that implement Ordered. 45 List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); 46 for (String ppName : orderedPostProcessorNames) { 47 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); 48 orderedPostProcessors.add(pp); 49 if (pp instanceof MergedBeanDefinitionPostProcessor) { 50 internalPostProcessors.add(pp); 51 } 52 } 53 sortPostProcessors(orderedPostProcessors, beanFactory); 54 registerBeanPostProcessors(beanFactory, orderedPostProcessors); 55 56 // Now, register all regular BeanPostProcessors. 57 List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); 58 for (String ppName : nonOrderedPostProcessorNames) { 59 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); 60 nonOrderedPostProcessors.add(pp); 61 if (pp instanceof MergedBeanDefinitionPostProcessor) { 62 internalPostProcessors.add(pp); 63 } 64 } 65 registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); 66 67 // Finally, re-register all internal BeanPostProcessors. 68 sortPostProcessors(internalPostProcessors, beanFactory); 69 registerBeanPostProcessors(beanFactory, internalPostProcessors); 70 71 // Re-register post-processor for detecting inner beans as ApplicationListeners, 72 // moving it to the end of the processor chain (for picking up proxies etc). 73 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); 74 } 75 76 private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) { 77 Comparator<Object> comparatorToUse = null; 78 if (beanFactory instanceof DefaultListableBeanFactory) { 79 comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator(); 80 } 81 if (comparatorToUse == null) { 82 comparatorToUse = OrderComparator.INSTANCE; 83 } 84 postProcessors.sort(comparatorToUse); 85 }