spring registerBeanPostProcessors(beanFactory) 源码详解
在 Spring 容器的refresh()过程中registerBeanPostProcessors(beanFactory)负责从容器中找出所有实现了BeanPostProcessor接口的类实例化它们并按顺序注册到BeanFactory中。这些BeanPostProcessor将在后续Bean 实例化和初始化的生命周期中被调用允许我们在 Bean 初始化前后对 Bean 实例进行增强例如 AOP 代理、属性注入等。1. 方法调用入口registerBeanPostProcessors(beanFactory)定义在AbstractApplicationContext中位于refresh()方法内// AbstractApplicationContext.java Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // ... // 调用 BeanFactoryPostProcessor修改 BeanDefinition invokeBeanFactoryPostProcessors(beanFactory); // 注册 BeanPostProcessor此时尚未实例化普通单例 Bean registerBeanPostProcessors(beanFactory); // ... 国际化、事件监听器等初始化 // 实例化所有单例 Bean非懒加载 finishBeanFactoryInitialization(beanFactory); } }此时所有的BeanDefinition已经加载完毕可能已被BeanFactoryPostProcessor修改但普通单例 Bean 尚未实例化。BeanPostProcessor需要提前实例化并注册到BeanFactory中以便在后续 Bean 实例化过程中能够立即生效。2. 实际执行委托AbstractApplicationContext并未直接实现注册逻辑而是委托给PostProcessorRegistrationDelegate的静态方法// AbstractApplicationContext.java protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }beanFactory当前容器的ConfigurableListableBeanFactory通常是DefaultListableBeanFactory。thisApplicationContext本身用于添加ApplicationListener某些BeanPostProcessor可能也是监听器。3.PostProcessorRegistrationDelegate.registerBeanPostProcessors核心源码解析3.1 整体流程public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { // 1. 获取容器中所有类型为 BeanPostProcessor 的 Bean 名称 String[] postProcessorNames beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); // 2. 统计容器中已存在的 BeanPostProcessor 数量用于后续日志输出 int beanProcessorTargetCount beanFactory.getBeanPostProcessorCount() 1 postProcessorNames.length; beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); // 3. 按优先级分组PriorityOrdered、Ordered、无顺序 ListBeanPostProcessor priorityOrderedPostProcessors new ArrayList(); ListBeanPostProcessor internalPostProcessors new ArrayList(); ListString orderedPostProcessorNames new ArrayList(); ListString nonOrderedPostProcessorNames new ArrayList(); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); // 同时检查是否为 MergedBeanDefinitionPostProcessorSpring 内部特殊处理 if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } // 4. 排序并注册 PriorityOrdered 组 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // 5. 排序并注册 Ordered 组 ListBeanPostProcessor 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); // 6. 注册无优先级组普通 ListBeanPostProcessor 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); // 7. 重新排序并注册 internalPostProcessorsMergedBeanDefinitionPostProcessor 通常需要最后注册 sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors); // 8. 将 BeanPostProcessor 中实现了 ApplicationListener 的添加到应用上下文的事件监听器列表 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }3.2 关键步骤说明获取所有BeanPostProcessor的 Bean 名称通过beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false)获取当前容器中定义的所有BeanPostProcessor类型的 Bean 名称。注意此时这些 Bean 尚未实例化只是BeanDefinition存在。添加一个BeanPostProcessorChecker这是一个内部辅助处理器用于在日志中输出BeanPostProcessor实例化过程中的警告信息例如某些BeanPostProcessor未能被正确注册不影响主要逻辑。按优先级分组PriorityOrdered最高优先级需要先被注册先注册的会先执行。Ordered次高优先级。普通无优先级最后注册。同时如果某个BeanPostProcessor还实现了MergedBeanDefinitionPostProcessor子接口则将其单独放入internalPostProcessors集合中稍后统一处理因为MergedBeanDefinitionPostProcessor通常需要在普通处理器之后执行用于合并 Bean 定义信息例如AutowiredAnnotationBeanPostProcessor。实例化并注册对于每一组通过beanFactory.getBean(ppName, BeanPostProcessor.class)立即实例化该BeanPostProcessor这会触发其依赖的 Bean 的创建。然后将实例化后的对象添加到BeanFactory的BeanPostProcessor列表中调用beanFactory.addBeanPostProcessor(pp)。注意BeanPostProcessor的实例化会提前发生因此编写BeanPostProcessor时应当避免依赖其他普通 Bean否则可能导致提前创建那些 Bean引发循环依赖或状态不一致问题。排序使用sortPostProcessors方法内部通过AnnotationAwareOrderComparator实现支持Ordered接口和Order注解。internalPostProcessors的特殊处理因为MergedBeanDefinitionPostProcessor需要处理所有 Bean 的合并 Bean 定义通常在postProcessMergedBeanDefinition阶段Spring 将它们单独分组并最后注册以确保它们在其他普通BeanPostProcessor之后才被添加到列表中。不过实际执行顺序仍受BeanFactory中BeanPostProcessor列表顺序的影响。ApplicationListenerDetector最后Spring 还会添加一个特殊的BeanPostProcessorApplicationListenerDetector它负责在 Bean 初始化后检测该 Bean 是否实现了ApplicationListener如果是则自动将其注册到应用上下文的事件广播器中。这个处理器必须最后注册以确保它能处理所有其他处理器。4.registerBeanPostProcessors辅助方法private static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, ListBeanPostProcessor postProcessors) { for (BeanPostProcessor postProcessor : postProcessors) { beanFactory.addBeanPostProcessor(postProcessor); } }ConfigurableListableBeanFactory的实现类如AbstractBeanFactory内部维护了一个ListBeanPostProcessor每当调用addBeanPostProcessor时新的处理器会被追加到列表尾部。后续创建 Bean 时会依次调用列表中的所有BeanPostProcessor。5.BeanPostProcessor的执行时机注册完成后在refresh()后续的finishBeanFactoryInitialization(beanFactory)方法中当容器实例化每个单例 Bean 时会按照注册顺序依次调用每个BeanPostProcessor的两个方法postProcessBeforeInitialization(Object bean, String beanName)在 Bean 的初始化方法如PostConstruct、afterPropertiesSet、自定义init-method之前调用。postProcessAfterInitialization(Object bean, String beanName)在初始化方法之后调用。此外MergedBeanDefinitionPostProcessor会在 Bean 实例化之前调用postProcessMergedBeanDefinition方法用于处理合并后的RootBeanDefinition。6. 与BeanFactoryPostProcessor的区别特性BeanFactoryPostProcessorBeanPostProcessor执行阶段Bean 定义加载之后Bean 实例化之前Bean 实例化之后初始化前后主要作用修改BeanDefinition元数据修改或增强 Bean 实例如代理、属性注入典型示例PropertySourcesPlaceholderConfigurer、ConfigurationClassPostProcessorAutowiredAnnotationBeanPostProcessor、ApplicationContextAwareProcessor执行次数全局一次每个 Bean 创建时都会执行注册方式通过invokeBeanFactoryPostProcessors调用可动态注册新 Bean 定义通过registerBeanPostProcessors注册到BeanFactory列表7. 注意事项与最佳实践不要依赖普通 BeanBeanPostProcessor的实例化发生在容器启动早期如果它依赖了其他普通 Bean通过Autowired等会导致那些 Bean 被提前创建可能引发循环依赖或出乎意料的副作用。优先级选择如果多个BeanPostProcessor对同一个 Bean 进行增强需要留意执行顺序。通常可以使用PriorityOrdered或Ordered接口来控制。线程安全BeanPostProcessor实例会被所有 Bean 的创建过程共享因此实现应该是线程安全的。性能BeanPostProcessor会对容器中每个Bean 的创建过程产生影响因此应避免在其中执行耗时操作。8. 总结registerBeanPostProcessors(beanFactory)是 Spring 容器启动过程中的一个重要步骤它负责从容器中找出所有BeanPostProcessor类实例化它们并按优先级排序后注册到BeanFactory的内部列表中。这些处理器后续会参与到每个 Bean 的创建过程中为 Spring 提供 AOP、依赖注入、上下文感知等核心功能。理解这个过程对于开发自定义BeanPostProcessor以及排查容器启动问题具有重要意义。