版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40718168/article/details/83995020
参考:https://www.cnblogs.com/sishang/p/6576665.html
1. 基本概念
spring容器在实例化bean之后(通过构造器创建对象并注入属性值即为实例化),可以使用BeanPostProcessor接口在bean的初始化方法前后根据需要做自己的逻辑处理。
2. BeanPostProcessor后置处理器的使用
BeanPostProcessor接口有两个方法,postProcessBeforeInitialization和postProcessAfterInitialization,默认情况下后置处理器会处理容器中所有的bean。
postProcessBeforeInitialization在bean初始化方法之前调用,初始化方法包括:bean标签添加init-method属性指定Java类中初始化方法、 @PostConstruct注解指定初始化方法,Java类实现InitailztingBean接口所产生的afterPropertiesSet()方法等。
postProcessAfterInitialization在bean初始化方法之后调用。
public class PostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean,
String beanName) throws BeansException {
if ("narCodeService".equals(beanName)) {//此方法获取容器中所有的bean,根据 beanName 名称选择要处理的bean,此处过滤实例ID为narCodeService
return bean;
}
System.out.println("后置处理器处理bean=【"+beanName+"】开始");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean,
String beanName) throws BeansException {
if ("narCodeService".equals(beanName)) {
return bean;
}
System.out.println("后置处理器处理bean=【"+beanName+"】完毕!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return bean;
}
}
上段代码两个方法的第一个参数为bean对象,第二个参数为bean对象的全称名称(包名加类名)。然后该实现类配置在spring配置文件中就可以使用了。多个后置处理器按照配置顺序执行,可以配置order属性进行设置优先级。