spring-系列
文章目录
前言
BeanPostProcessor接口是spring重要的接口之一,Bean的增强功能大部分都是基于这个接口来实现。如通过 @Autowired、@Value、@Resource、@PostConstruct 和 @PreDestroy等注解都是基于BeanPostProcessor的子接口InstantiationAwareBeanPostProcessor接口实现逻辑处理。本文跟着博主一起来揭开BeanPostProcessor的神秘面纱。
接口描述
BeanPostProcessor是允许自定义修改新建bean实例的工厂钩子,spring为了增强该接口的功能定义了4个子接口InstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor,DestructionAwareBeanPostProcessor和MergedBeanDefinitionPostProcessor下面讨论他们。
BeanPostProcessor
public interface BeanPostProcessor {
/**
* 在任何bean初始化回调之前(如InitializingBean的afterPropertiesSet或自定义init方法),将此应用于给定的新bean实例。
* bean将已经被属性值填充。返回的bean实例可能是原始实例的包装器。
*
*/
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
/**
* 在任何bean初始化回调之后(如InitializingBean的afterPropertiesSet}或自定义init方法),将此{@code BeanPostProcessor}应用于给定的新bean实例。
* bean将已经被属性值填充。返回的bean实例可能是原始实例的包装器。
*/
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
根据源码会发现postProcessBeforeInitialization(Object bean, String beanName) 是在初始化(InitializingBean的afterPropertiesSet或自定义init方法)之前执行,可以修改或包装Bean的实例。 postProcessAfterInitialization(Object bean, String beanName) 方法则相反在初始化之后执行,可以修改或包装Bean的实例。
InstantiationAwareBeanPostProcessor
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
/**
* 根据beanClass和beanName实例化Bean,返回实例化对象,如果实例化成功将忽略spring默认初始化的逻辑,否则使用spring的内部初始化逻辑
*/
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
/**
* 在通过构造函数或工厂方法实例化bean之后,但在Spring属性填充(来自显式属性或自动连接)发生之前,执行操作。
*/
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
/**
* 处理bean的属性值《spring注入就是从这个方法开始》,发生在实例化Bean之后,初始化Bean(InitializingBean#afterPropertiesSet或自定义init方法)之前
*/
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
return null;
}
/**
* 根据Bean的属性描述来赋值,spring1.5之后已被弃用,由postProcessProperties方法来取代
*/
@Deprecated
@Nullable
default PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
return pvs;
}
}
根据源码很显然InstantiationAwareBeanPostProcessor是为Bean的实例化和属性赋值而生的,当存在多个InstantiationAwareBeanPostProcessor接口时只要有一个实例化成功,将直接返回。postProcessProperties(PropertyValues pvs, Object bean, String beanName)是属性值注入的入口方法, @Resource注入方式使用了CommonAnnotationBeanPostProcessor实现,@Autowired和 @Value由AutowiredAnnotationBeanPostProcessor类实现。
SmartInstantiationAwareBeanPostProcessor
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
/**
* 预测最终从此处理器的{@link#postprocessebefore实例化}回调返回的bean的类型
*/
@Nullable
default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
/**
* 确定用于给定bean的候选构造函数。默认返回null
*/
@Nullable
default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
throws BeansException {
return null;
}
/**
* 对指定bean获取早期访问的引用,通常用于解析循环引用。
*/
default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
return bean;
}
}
很显然SmartInstantiationAwareBeanPostProcessor是InstantiationAwareBeanPostProcessor的扩展,添加了一下默认预测方法,目标都是为了Bean的实例化和注入,例如AutowiredAnnotationBeanPostProcessor就是继承该接口。
DestructionAwareBeanPostProcessor
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {
/**
* 在给定bean实例销毁之前,将此BeanPostProcessor应用于该实例,例如调用自定义销毁回调。
*/
void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;
/**
* 确定给定bean实例是否需要此后处理器销毁
*/
default boolean requiresDestruction(Object bean) {
return true;
}
}
用于添加Bean销毁前回调。
MergedBeanDefinitionPostProcessor
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
/**
* 对指定bean的给定合并bean定义进行后期处理。
*/
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
/**
* 通知指定名称的bean定义已重置,并且此后处理器应清除受影响bean的所有元数据
*/
default void resetBeanDefinition(String beanName) {
}
}
MergedBeanDefinitionPostProcessor是spring内部实现合并bean定义的后处理器回调接口。一般情况下不用研究。
总结
BeanPostProcessor是spring对Bean功能增强的实现,其中InstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor,DestructionAwareBeanPostProcessor和MergedBeanDefinitionPostProcessor就是spring在内部增强Bean的体现,一般情况下不推荐直接使用这些内部接口。当我们自己开发一个spring插件或者是个性化处理功能时可以考虑使用BeanPostProcessor接口来实现。