一、简介
BeanPostProcessor是一个Spring框架提供的扩展点,对Bean初始化前后进行处理,可以在初始化之前对Bean进行一些自定义操作(例如进行注入或者修改属性值),也可以在初始化之后进行一些操作(例如在Bean加载完成后进行数据格式转换或者执行切面操作)。
BeanPostProcessor本身并不对Bean做出任何修改,而是提供了一种实现AOP的方式,常用于解决注入、AOP、事务等Spring框架中的一些核心问题。
二、应用场景
1. 注入
BeanPostProcessor最常见的应用场景之一是进行注入处理。通过注入后置处理器,我们可以在Bean对象创建完成后,自动完成一些属性的注入操作,从而达到自动装配的效果。
public class MyPostProcessor implements BeanPostProcessor {
// 实现 before 方法
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeforeInitialization : " + beanName);
return bean; //因为需要返回bean,所以这里要返回
}
// 实现 after 方法
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("AfterInitialization : " + beanName);
return bean; //因为需要返回bean,所以这里要返回
}
}
2. AOP
BeanPostProcessor提供的后置处理器,可以在Bean创建完成之后,通过动态代理机制进行切面操作,以达到AOP的目的。
public class MyPostProcessor implements BeanPostProcessor {
// 实现 before 方法
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
// 实现 after 方法
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof UserService){
bean = Proxy.newProxyInstance(
bean.getClass().getClassLoader(),
bean.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("------AOP before--------");
Object result = method.invoke(bean, args);
System.out.println("------AOP after--------");
return result;
}
}
);
}
return bean;
}
}
3. 事务管理
通过注入BeanPostProcessor,可以在Bean初始化之后,自动进行事务代理的创建。在方法中进行判断后进行连接、事务提交、事务回滚等操作。
public class MyPostProcessor implements BeanPostProcessor {
// 实现 before 方法
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
// 实现 after 方法
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof Transactional){
bean = TransactionProxy.createProxy(bean);
}
return bean;
}
}
三、注意事项
在使用BeanPostProcessor时,需注意以下几点:
1. 执行顺序
多个后置处理器共同作用时顺序的问题,我们无法确定到底是哪个后置处理器先生效,因此不要定义多个后置处理器,尤其是在后置处理器依赖其他类的情况下。
2. 不要过度依赖BeanPostProcessor
类在实例化的时候去依赖处理器,不可避免的会导致代码紧紧耦合。特别是当后置处理器之间还有依赖关系时,出现的代码质量会更为糟糕。
3. BeanPostProcessor不要处理FrameworkBean
BeanPostProcessor最好不要操作Framework Bean,里面的bean例外,因为这些bean可以说是现成的BeanFactory中的组件。
4. 及时清理
BeanPostProcessor在无用的时候,要及时销毁清理,避免对外部产生过多的依赖。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/155227.html