后置处理器BeanPostProcessor
BeanPostProcessor:回调机制,在 bean 的初始化前后做一些额外的处理,扩展功能。
可以配置多个 BeanPostProcessor 实例,并且可以通过实现Ordered接口,设置order属性来控制这些BeanPostProcessor实例的运行顺序。
//原接口
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;
}
}
//编写后置处理器,对每个bean的创建都会生效
@Component
public class AnimalBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("拦截到Bean的初始化之前:" + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("拦截到Bean的初始化之后:" + beanName);
return bean;
}
}
通过后置处理器修改bean的属性
@Component
public class CatBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Cat) {
Cat cat = (Cat) bean;
System.out.println("初始化之前,cat的name为:" + cat.getName());
cat.setName("zhangsan");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Cat) {
Cat cat = (Cat) bean;
System.out.println("初始化之后,cat的name为:" + cat.getName());
}
return bean;
}
}
bean的初始化流程:

对于factorybean,后置处理器会在factorybean创建时执行Before和after方法,在用factorybean去getbean时,执行after方法。
BeanPostProcessor的扩展接口:

InstantiationAwareBeanPostProcessor:

default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
return null;
}
DestructionAwareBeanPostProcessor:
void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;
default boolean requiresDestruction(Object bean) {
return true;
}
@Component
public class DestructionPenPostProcessor implements DestructionAwareBeanPostProcessor {
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
if (bean instanceof Pen) {
System.out.println("DestructionPenPostProcessor postProcessBeforeDestruction run ......");
Pen pen = (Pen) bean;
pen.setInk(0);
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------BeanFactoryPostProcessor:BeanFactoryPostProcessor 的作用是在 BeanDefinition 已经注册到 BeanFactory 后,对 BeanDefinition 进行修改 / 配置,其本身也是一个bean。

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Stream.of(beanFactory.getBeanDefinitionNames()).forEach(beanName -> {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
if (StringUtils.hasText(beanDefinition.getBeanClassName())) {
if (ClassUtils.resolveClassName(beanDefinition.getBeanClassName(), this.getClass().getClassLoader())
.getSuperclass().equals(Color.class)) {
beanDefinition.getPropertyValues().add("name", beanName);
}
}
});
}
BeanDefinitionRegistryPostProcessor:BeanDefinitionRegistryPostProcessor 的执行时机比 BeanFactoryPostProcessor 更早,BeanFactoryPostProcessor 一般只用来修改、扩展 BeanDefinition 中的信息,而 BeanDefinitionRegistryPostProcessor 则可以在 BeanFactoryPostProcessor 处理 BeanDefinition 之前,向 BeanFactory 注册新的 BeanDefinition ,甚至注册新的 BeanFactoryPostProcessor 用于下一个阶段的回调。

@Component
public class DogRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
if (!registry.containsBeanDefinition("dog")) {
// 构造BeanDefinition,并注册进BeanFactory
BeanDefinition dogDefinition = BeanDefinitionBuilder.genericBeanDefinition(Dog.class).getBeanDefinition();
registry.registerBeanDefinition("dog", dogDefinition);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}

浙公网安备 33010602011771号