Spring 源码之核心加载方法 常用扩展点接口
1. 核心接口 BeanPostProcessor
1 | public interface BeanFactoryPostProcessor { |
1.2 常用接口
1.2.1 BeanDefinitionRegistryPostProcessor
调用方法: PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
时机: BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry 会优先于 BeanPostProcessor #postProcessBeanFactory 方法的执行
作用: 所有 BeanDefinition 加载完成之后, 提供增删改查 BeanDefinitionRegistry (注册表) 的埋点
1.3 常用实现类
1.3.1 ConfigurationClassPostProcessor
作用: 它是用来解析配置类的, 可解析类注解 @Configuration, @CompentScan 等
2. 核心接口 BeanPostProcessor
1 | public interface BeanPostProcessor { |
2.2 常用接口
- SmartInstantiationAwareBeanPostProcessor
- MergedBeanDefinitionPostProcessor
- InstantiationAwareBeanPostProcessor
- DestructionAwareBeanPostProcessor
2.3 常用接口执行顺序
2.3.1 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
调用方法:AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation ===>>> #applyBeanPostProcessorsBeforeInstantiation
作用: 在实例化目标 bean 之前调用这个 BeanPostProcessor。返回的 bean 对象可以是一个代理来代替目标 bean,有效地抑制了目标 bean 的默认实例化。
2.3.2 SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
调用方法:AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
作用: 检测Bean的构造器,可以检测出多个候选构造器,再有相应的策略决定使用哪一个,如AutowiredAnnotationBeanPostProcessor实现将自动扫描通过@Autowired/@Value注解的构造器从而可以完成构造器注入
2.3.3 MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
调用方法: AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
作用: 在Bean实例化完毕后调用 可以用来修改Merged BeanDefinition的一些properties 或者用来给后续回调中缓存一些meta信息, 这是将Merged BeanDefinition暴露出来的一个回调
2.3.4 SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
调用方法: AbstractAutowireCapableBeanFactory#getEarlyBeanReference
作用: 获取早期访问指定 bean 的引用,通常用于解析循环引用。此回调使后处理器有机会尽早公开包装实例,即在目标 bean 实例完全初始化之前。
2.3.5 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
调用方法: AbstractAutowireCapableBeanFactory#populateBean
作用: 在 bean 实例化之后,通过构造函数或工厂方法,但在 Spring 属性填充(从显式属性或自动连接)发生之前,执行操作。这是在 Spring 的自动注入开始之前,在给定 bean 实例上执行自定义字段注入的回调。返回值可以终止属性填充。
2.3.6 InstantiationAwareBeanPostProcessor#postProcessProperties
调用方法: AbstractAutowireCapableBeanFactory#populateBean
作用: 在工厂将给定的属性值赋值到 bean 实例之前,对其进行后处理,而不需要任何属性描述符。
2.3.7 BeanPostProcessor#postProcessBeforeInitialization
调用方法: AbstractAutowireCapableBeanFactory#initializeBean ===>>> #applyBeanPostProcessorsBeforeInitialization
作用: 在任何 bean 初始化回调(如InitializingBean的AfterPropertieSet或自定义init方法)之前,将此BeanPostProcessor应用于给定的新bean实例。
2.3.8 InitializingBean#afterPropertiesSet
调用方法: AbstractAutowireCapableBeanFactory#invokeInitMethods
作用: bean 的初始化方法, 执行完成之后才会执行 自定义的 init 方法
2.3.9 BeanPostProcessor#postProcessAfterInitialization
调用方法: AbstractAutowireCapableBeanFactory#initializeBean ===>>> #applyBeanPostProcessorsAfterInitialization
作用: 在任何bean初始化回调(如InitializingBean的AfterPropertieSet或自定义init方法)之后,将此BeanPostProcessor应用于给定的新bean实例。
2.3.10 DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
调用方法: AbstractAutowireCapableBeanFactory#destroyBean ===>>> DisposableBeanAdapter#destroy
作用: 在给定bean实例被销毁之前,将此BeanPostProcessor应用于该实例,例如调用自定义销毁回调。与DisposableBean的destroy和自定义destroy方法一样,此回调将仅适用于容器完全管理其生命周期的bean。单例bean和作用域bean通常都是这样。
2.3.10 DisposableBean#destroy
调用方法: AbstractAutowireCapableBeanFactory#destroyBean ===>>> DisposableBeanAdapter#destroy
作用: bean 的销毁方法, 执行完成之后才会执行自定义的 destroy 方法
2.4 接口无执行顺序
2.4.1 SmartInstantiationAwareBeanPostProcessor#predictBeanType
调用方法: AbstractAutowireCapableBeanFactory#predictBeanType
1 | // AbstractApplicationContext#refresh |
作用: 用来预判类型的
3. 接口 SmartInitializingSingleton
1 | public interface SmartInitializingSingleton { |
3.1 org.springframework.beans.factory.SmartInitializingSingleton
调用方法: org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons
作用: 所有单例对象加载完成后调用,可以使用此接口回调处理逻辑