一、簡介
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/zh-hant/n/155227.html