您好,登錄后才能下訂單哦!
本篇文章為大家展示了BeanPostProcessor后置處理器在Spring中的作用是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
BeanPostProcessor接口作用:
如果我們想在Spring容器中完成bean實例化、配置以及其他初始化方法前后要添加一些自己邏輯處理。我們需要定義一個或多個BeanPostProcessor接口實現類,然后注冊到Spring IoC容器中。
package com.test.spring; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * bean后置處理器 * @author zss * */ public class PostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if ("narCodeService".equals(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; } }
注意:接口中兩個方法不能返回null,如果返回null那么在后續初始化方法將報空指針異常或者通過getBean()方法獲取不到bena實例對象,因為后置處理器從Spring IoC容器中取出bean實例對象沒有再次放回IoC容器中!
將Spring的后置處理器PostProcessor配置到Spring配置文件中
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定義一個bean --> <bean id="narCodeService" class="com.test.service.impl.NarCodeServiceImpl"> </bean> <bean id="beanLifecycle" class="com.test.spring.BeanLifecycle" init-method="init" destroy-method="close"> <property name="name" value="張三"></property> <property name="sex" value="男"></property> </bean> <!-- Spring后置處理器 --> <bean id="postProcessor" class="com.test.spring.PostProcessor"/> </beans>
BeanPostProcessor API:
public interface BeanPostProcessor { //實例化、依賴注入完畢,在調用顯示的初始化之前完成一些定制的初始化任務 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; //實例化、依賴注入、初始化完畢時執行 Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
由API可以看出:
1:后置處理器的postProcessorBeforeInitailization方法是在bean實例化,依賴注入之后及自定義初始化方法(例如:配置文件中bean標簽添加init-method屬性指定Java類中初始化方法、
@PostConstruct注解指定初始化方法,Java類實現InitailztingBean接口)之前調用
2:后置處理器的postProcessorAfterInitailization方法是在bean實例化、依賴注入及自定義初始化方法之后調用
注意:
1.BeanFactory和ApplicationContext兩個容器對待bean的后置處理器稍微有些不同。ApplicationContext容器會自動檢測Spring配置文件中那些bean所對應的Java類實現了BeanPostProcessor
接口,并自動把它們注冊為后置處理器。在創建bean過程中調用它們,所以部署一個后置處理器跟普通的bean沒有什么太大區別。
2.BeanFactory容器注冊bean后置處理器時必須通過代碼顯示的注冊,在IoC容器繼承體系中的ConfigurableBeanFactory接口中定義了注冊方法
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
Spring如何調用多個BeanPostProcessor實現類:
我們可以在Spring配置文件中添加多個BeanPostProcessor(后置處理器)接口實現類,在默認情況下Spring容器會根據后置處理器的定義順序來依次調用。
Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- bean定義 --> <bean id="narCodeService" class="com.test.service.impl.NarCodeServiceImpl"> </bean> <bean id="postProcessor" class="com.test.spring.PostProcessor"/> <bean id="postProcessorB" class="com.test.spring.PostProcessorB"/> </beans>
BeanPostProcessor實現類:
package com.test.spring; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * bean后置處理器 * @author zss * */ public class PostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 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 { System.out.println("后置處理器處理bean=【"+beanName+"】完畢!"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return bean; } } ---------------------------------------------------------------------------------------------------------------------------------------- package com.test.spring; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class PostProcessorB implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("后置處理器開始調用了"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("后置處理器調用結束了"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return bean; } }
Test case:
package com.test.spring; import org.junit.Before; import org.junit.Test; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class T { AbstractApplicationContext applicationcontext=null; @Before public void before() { System.out.println("》》》Spring ApplicationContext容器開始初始化了......"); applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"}); System.out.println("》》》Spring ApplicationContext容器初始化完畢了......"); } @Test public void test() { applicationcontext.registerShutdownHook(); } }
測試結果:
》》》Spring ApplicationContext容器開始初始化了...... 2017-03-19 10:50:29 INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@18c92ff9: startup date [Sun Mar 19 10:50:29 CST 2017]; root of context hierarchy 2017-03-19 10:50:29 INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml] 后置處理器處理bean=【narCodeService】開始 后置處理器開始調用了 后置處理器處理bean=【narCodeService】完畢! 后置處理器調用結束了 》》》Spring ApplicationContext容器初始化完畢了...... 2017-03-19 10:50:34 INFO:ClassPathXmlApplicationContext-Closing org.springframework.context.support.ClassPathXmlApplicationContext@18c92ff9: startup date [Sun Mar 19 10:50:29 CST 2017]; root of context hierarchy
在Spring機制中可以指定后置處理器調用順序,通過讓BeanPostProcessor接口實現類實現Ordered接口getOrder方法,該方法返回一整數,默認值為 0,優先級最高,值越大優先級越低
上述內容就是BeanPostProcessor后置處理器在Spring中的作用是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。