Article directory
RegiserBeanPostProcessors () in spring refresh(): Postprocessor for registered bean s
BeanPostProcessor: bean post-processor that intercepts objects before and after initialization.
View registerBeanPostProcessors():
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }
Is the PostProcessor RegistrationDelegate class familiar, as shown above?< spring source parsing (8): invokeBeanFactoryPostProcessors() in refresh(): instantiate and invoke the post-processor of the bean factory > The invokeBeanFactoryPostProcessors method is also called in the PostProcessorRegistrationDelegate class.
BeanPostProcessor interface is an extension point exposed when Spring initializes beans. Spring IoC container allows BeanPostProcessor to add its own logical processing before and after the container initializes beans.
View the registerBeanPostProcessors() method:
public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { //1. Get all the classes that implement the BeanPostProcessor interface //The examples are as follows: //org.springframework.context.annotation.internalAutowiredAnnotationProcessor //org.springframework.context.annotation.internalRequiredAnnotationProcessor //org.springframework.context.annotation.internalCommonAnnotationProcessor String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); //BeanPost Processor Target Count int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; //2. Add BeanPostProcessor Checker to beanFactory beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); //3. Define different variables to distinguish: BeanPostProcessor that implements the PriorityOrdered interface, BeanPostProcessor that implements the Ordered interface, and BeanPostProcessor that implements the Ordered interface. // 3.1 priorityOrderedPostProcessors: BeanPostProcessor s for storing PriorityOrdered interfaces List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); //3.2 Internal PostProcessors: BeanPostProcessor s for storing Spring internals List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); //3.3 ordered PostProcessor Names: BeanPostProcessor beanName used to store BeanPostProcessor implementing the Ordered interface List<String> orderedPostProcessorNames = new ArrayList<>(); //3.4 NonOrdered PostProcessor Names: beanName for storing ordinary BeanPostProcessor s List<String> nonOrderedPostProcessorNames = new ArrayList<>(); //4. Traverse postProcessor Names to distinguish BeanPostProcessors from variables defined in 3.1 - 3.4 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); } } //5. First, register BeanPostProcessors that implement the PriorityOrdered interface //5.1 Sort Priority Ordered PostProcessors sortPostProcessors(priorityOrderedPostProcessors, beanFactory); //5.2 Register Priority Ordered Post Processors registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); //6. Next, register BeanPostProcessors that implement the Ordered interface List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } sortPostProcessors(orderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, orderedPostProcessors); // Now, register all regular BeanPostProcessors. //7. Register all regular BeanPost Processors List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); 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. //8. Finally, re-register all internal BeanPostProcessors (equivalent to the internal BeanPostProcessor being moved to the end of the processor chain) sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors); // Re-register post-processor for detecting inner beans as ApplicationListeners, // moving it to the end of the processor chain (for picking up proxies etc). //9. Re-register Application Listener Detector (similar to 8, mainly to move to the end of the processor chain) beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }
Result of registration: