Spring 源码之核心加载方法 常用扩展点接口

1. 核心接口 BeanPostProcessor

1
2
3
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

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
2
3
4
5
6
7
8
9
10
11
public interface BeanPostProcessor {

default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

}

2.2 常用接口

  1. SmartInstantiationAwareBeanPostProcessor
  2. MergedBeanDefinitionPostProcessor
  3. InstantiationAwareBeanPostProcessor
  4. 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
2
3
4
5
6
7
// AbstractApplicationContext#refresh
// ==> AbstractApplicationContext#registerListeners
// ==> AbstractApplicationContext#getBeanNamesForType
// ==> DefaultListableBeanFactory#doGetBeanNamesForType
// ==> AbstractAutowireCapableBeanFactory#predictBeanType
// 被此逻辑触发
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);

作用: 用来预判类型的

3. 接口 SmartInitializingSingleton

1
2
3
public interface SmartInitializingSingleton {
void afterSingletonsInstantiated();
}

3.1 org.springframework.beans.factory.SmartInitializingSingleton

调用方法: org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons

作用: 所有单例对象加载完成后调用,可以使用此接口回调处理逻辑