invokeBeanFactoryPostProcessors 方法解析BeanFactoryPostProcessor 与 BeanPostProcessor 的区别BeanFactoryPostProcessor 是对 BeanFactory 的后置处理用于修改配置元数据。BeanPostProcessor 是对 Bean 的后置处理用于修改 Bean 实例。BeanFactoryPostProcessor 的执行流程Spring在执行 refresh 方法时会调用 invokeBeanFactoryPostProcessors。该方法负责执行所有 BeanFactoryPostProcessor 接口及其实现类的 postProcessBeanFactory 方法。BeanFactoryPostProcessor 的子接口 BeanDefinitionRegistryPostProcessor 用于注册新的 BeanDefinition。执行顺序说明首先执行 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法。然后执行 BeanFactoryPostProcessor 的 postProcessBeanFactory 方法。若存在多个处理器会根据 Order 接口或 PriorityOrder 接口进行排序。registerBeanPostProcessors 方法解析BeanPostProcessor 的注册流程从 BeanFactory 中获取所有实现了 BeanPostProcessor 接口的 Bean。根据接口实现类型PriorityOrder、Order、无接口进行分类排序。将排序后的 BeanPostProcessor 实例添加到 BeanFactory 的 postProcessors 列表中。特殊接口 MergedBeanDefinitionPostProcessor 的处理实现该接口的处理器会被单独添加到列表末尾。Spring内部的一些处理器如 AutowiredAnnotationBeanPostProcessor属于此类。最终 BeanPostProcessor 列表顺序PriorityOrder 接口实现者优先。Order 接口实现者其次。无接口实现者最后。MergedBeanDefinitionPostProcessor 总是在最后。配置类的定义与判断逻辑什么是配置类加了 Configuration 注解的类。或者类中存在 Bean 注解的方法。或者类上存在 Component、ComponentScan、Import、ImportResource 等注解。配置类的判断逻辑通过类上的注解信息判断是否为 Full 配置类Configuration 且 proxyBeanMethods true或 Lite 配置类其他情况。配置类分为两种类型Full全配置类和 Lite轻量配置类。配置类的解析流程配置类解析器的构建使用 ConfigurationClassParser 解析配置类。解析器内部维护一个 Map 用于存储已解析的配置类。解析过程Component 注解处理若配置类上存在 Component 注解会进一步检查其内部类是否为配置类。ComponentScan 注解处理触发组件扫描将扫描到的 BeanDefinition 注册到 BeanFactory。扫描到的类若为配置类会递归解析。Import 注解处理导入的类若为普通类视为配置类并解析。若导入类实现 ImportSelector 接口调用其 selectImports 方法获取更多类并递归解析。若导入类实现 ImportBeanDefinitionRegistrar 接口将其保存至配置类属性中后续统一处理。ImportResource 注解处理保存 XML 配置文件路径至配置类属性中后续统一解析。Bean 方法处理提取所有 Bean 方法封装为 BeanMethod 对象并保存至配置类属性中。实现接口的 Bean 方法处理若配置类实现接口并且接口中有默认方法加了 Bean 注解也会被提取并处理。父类处理若配置类有父类递归解析父类。配置类的递归解析与循环导入控制递归解析机制解析一个配置类时可能触发对其导入类、扫描类、父类的递归解析。所有新增的配置类会被统一处理。循环导入检测Spring 检测到循环导入如 A 导入 BB 又导入 A时会抛出异常。通过 importedBy 属性记录导入来源用于检测循环依赖。Bean 方法的处理与BeanDefinition生成Bean 方法的封装与保存将配置类中所有 Bean 方法封装为 BeanMethod 对象。保存至配置类对象的 beanMethods 属性中。BeanDefinition 的生成时机在配置类解析完成后统一调用 loadBeanDefinitions 方法生成 BeanDefinition。包括 Bean 方法、Import 导入类、ComponentScan 扫描类等。Import 注解的三种处理方式普通类导入将导入类视为配置类递归解析。实现 ImportSelector 接口的类调用其 selectImports 方法获取更多类名递归解析。实现 ImportBeanDefinitionRegistrar 接口的类将其实例保存至配置类属性中后续统一调用其 registerBeanDefinitions 方法注册 BeanDefinition。配置类的代理增强机制ConfigurationFull 配置类与 Lite 配置类的区别Full 配置类加了 Configuration 注解proxyBeanMethods true。Lite 配置类加了 Component、Bean 方法等但未加 Configuration。代理机制的作用保证配置类中 Bean 方法调用时返回的是 Spring 容器中的单例 Bean。避免多次调用 Bean 方法时重复创建实例。代理逻辑实现Spring 通过 CGLIB 生成配置类的代理类。代理类中对 Bean 方法进行拦截。若当前调用方法是创建目标 Bean 的流程则直接执行方法生成实例。若当前调用方法是其他 Bean 创建流程中调用该 Bean 方法则从容器中获取已有 Bean。配置类覆盖与BeanDefinition冲突处理Component 与 ComponentScan 冲突处理若两个 Component 类生成同名 BeanDefinitionSpring 会抛出异常。Bean 方法的覆盖逻辑若多个 Bean 方法生成同名 BeanDefinition默认会进行覆盖。可通过 allowBeanDefinitionOverriding 属性控制是否允许覆盖。