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 default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { return null; } @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { return true; }
@Nullable default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
return null; }
@Deprecated @Nullable default PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { 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; } @Nullable default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException { return null; } 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 { void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
default void resetBeanDefinition(String beanName) { } }
|
MergedBeanDefinitionPostProcessor 主要用于以下场景:
进一步修改 BeanDefinition 的属性:可以在 postProcessMergedBeanDefinition() 方法中对合并后的 BeanDefinition 进行进一步的修改,例如修改属性的值、添加自定义的注解或标记等。这对于一些复杂的场景,例如多个模块的配置合并、动态设置 Bean 的属性等非常有用。
额外的元数据处理:可以通过 MergedBeanDefinitionPostProcessor 在合并后的 BeanDefinition 上添加额外的元数据,例如扩展属性、关联其他的信息等。这样可以方便地传递额外的信息给其他的处理器或者依赖注入时使用。
高级的 AOP 处理:通过实现 MergedBeanDefinitionPostProcessor 接口,并结合 AOP 的相关框架,可以在合并后的 BeanDefinition 上应用 AOP 的功能。这样可以实现面向切面编程,为目标 Bean 添加额外的行为。
需要注意的是,MergedBeanDefinitionPostProcessor 是在合并 BeanDefinition 的阶段执行的,和 Bean 的实例化和初始化过程是分开的。因此,在实现 MergedBeanDefinitionPostProcessor 时,应该只进行一些轻量级的操作,不应该有过多的复杂逻辑和重量级的操作。
它可以对合并后的 BeanDefinition 进行修改、添加元数据以及应用高级的 AOP 处理。使用MergedBeanDefinitionPostProcessor 可以实现更灵活的 BeanDefinition 处理和定制化的功能。