1. InstantiationAwareBeanPostProcessor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
@Nullable
//在createBean() -> resolveBeforeInstantiation() 下调用,
// 与resolveBeforeInstantiation配合所有postProcessBeforeInstantiation调用完成之后调用postProcessAfterInitialization
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
//这个方法在父类`BeanPostProcessor`中,放在这里为了对比下一个方法,不一样
//在createBean() -> resolveBeforeInstantiation() 下调用,调用了postProcessBeforeInstantiation之后调用本方法
//初始化之后的方法 Initialization=初始化
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
//在papulateBean()中使用, 实例化之后的方法 Instantiation=实例化
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}

//在populateBean()中使用,注入了依赖bean之后调用此方法
//和postProcessPropertyValues在一处,执行了此方法后面紧跟postProcessPropertyValues()方法
//是对注入类型的变化的扩展吗
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {

return null;
}

//在populateBean()中使用,注入了依赖bean之后调用此方法
//和postProcessPropertyValues在一处
//是对注入类型的变化的扩展吗
@Deprecated
@Nullable
default PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
//此处返回为空的话则直接结束填充bean了
return pvs;
}
}

2. SmartInstantiationAwareBeanPostProcessor 解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
@Nullable
default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
//解析构造器,在doCreateBean拿到初始构造器时调用
@Nullable
default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
throws BeansException {
return null;
}
//doGetBean() 在实例化bean后准备放入三级缓存中的时候调用此方法
default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
return bean;
}
}

3. MergedBeanDefinitionPostProcessor 解析

在doCreateBean 中bean实例化后,初始化之前执行,用于合并BeanDefinition

MergedBeanDefinitionPostProcessor 接口定义了一个方法 postProcessMergedBeanDefinition(),在这个方法中,可以对合并后的 BeanDefinition 进行自定义处理。传入的参数是合并后的 BeanDefinition 对象和对应的 Bean 的名称。

1
2
3
4
5
6
7
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
//对BeanDefinition做合并处理
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);

default void resetBeanDefinition(String beanName) {
}
}

MergedBeanDefinitionPostProcessor 主要用于以下场景:

  1. 进一步修改 BeanDefinition 的属性:可以在 postProcessMergedBeanDefinition() 方法中对合并后的 BeanDefinition 进行进一步的修改,例如修改属性的值、添加自定义的注解或标记等。这对于一些复杂的场景,例如多个模块的配置合并、动态设置 Bean 的属性等非常有用。

  2. 额外的元数据处理:可以通过 MergedBeanDefinitionPostProcessor 在合并后的 BeanDefinition 上添加额外的元数据,例如扩展属性、关联其他的信息等。这样可以方便地传递额外的信息给其他的处理器或者依赖注入时使用。

  3. 高级的 AOP 处理:通过实现 MergedBeanDefinitionPostProcessor 接口,并结合 AOP 的相关框架,可以在合并后的 BeanDefinition 上应用 AOP 的功能。这样可以实现面向切面编程,为目标 Bean 添加额外的行为。

需要注意的是,MergedBeanDefinitionPostProcessor 是在合并 BeanDefinition 的阶段执行的,和 Bean 的实例化和初始化过程是分开的。因此,在实现 MergedBeanDefinitionPostProcessor 时,应该只进行一些轻量级的操作,不应该有过多的复杂逻辑和重量级的操作。

它可以对合并后的 BeanDefinition 进行修改、添加元数据以及应用高级的 AOP 处理。使用MergedBeanDefinitionPostProcessor 可以实现更灵活的 BeanDefinition 处理和定制化的功能。