文章目录
spring-系列前言接口描述
BeanPostProcessorInstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessorDestructionAwareBeanPostProcessorMergedBeanDefinitionPostProcessor 总结
前言
BeanPostProcessor接口是spring重要的接口之一,Bean的增强功能大部分都是基于这个接口来实现。如通过 @Autowired、@Value、@Resource、@PostConstruct 和 @PreDestroy等注解都是基于BeanPostProcessor的子接口InstantiationAwareBeanPostProcessor接口实现逻辑处理。本文跟着博主一起来揭开BeanPostProcessor的神秘面纱。
接口描述BeanPostProcessor是允许自定义修改新建bean实例的工厂钩子,spring为了增强该接口的功能定义了4个子接口InstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor,DestructionAwareBeanPostProcessor和MergedBeanDefinitionPostProcessor下面讨论他们。
BeanPostProcessor
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return 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 {
@Nullable
default Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {
return null;
}
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;
}
}
根据源码很显然InstantiationAwareBeanPostProcessor是为Bean的实例化和属性赋值而生的,当存在多个InstantiationAwareBeanPostProcessor接口时只要有一个实例化成功,将直接返回。postProcessProperties(PropertyValues pvs, Object bean, String beanName)是属性值注入的入口方法, @Resource注入方式使用了CommonAnnotationBeanPostProcessor实现,@Autowired和 @Value由AutowiredAnnotationBeanPostProcessor类实现。
SmartInstantiationAwareBeanPostProcessorpublic 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;
}
}
很显然SmartInstantiationAwareBeanPostProcessor是InstantiationAwareBeanPostProcessor的扩展,添加了一下默认预测方法,目标都是为了Bean的实例化和注入,例如AutowiredAnnotationBeanPostProcessor就是继承该接口。
DestructionAwareBeanPostProcessor
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {
void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;
default boolean requiresDestruction(Object bean) {
return true;
}
}
用于添加Bean销毁前回调。
MergedBeanDefinitionPostProcessor
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class> beanType, String beanName);
default void resetBeanDefinition(String beanName) {
}
}
MergedBeanDefinitionPostProcessor是spring内部实现合并bean定义的后处理器回调接口。一般情况下不用研究。
总结BeanPostProcessor是spring对Bean功能增强的实现,其中InstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor,DestructionAwareBeanPostProcessor和MergedBeanDefinitionPostProcessor就是spring在内部增强Bean的体现,一般情况下不推荐直接使用这些内部接口。当我们自己开发一个spring插件或者是个性化处理功能时可以考虑使用BeanPostProcessor接口来实现。



