詳解Spring中Bean后置處理器(BeanPostProcessor)的使用
一、BeanPostProcessor接口
Bean后置處理:對(duì)Spring 工廠創(chuàng)建的對(duì)象進(jìn)行二次加工處理,即預(yù)初始化和后初始化。
PostProcessor中文意思就是后置處理器。
BeanPostProcessor 接口也被稱為Bean后置處理器,通過(guò)該接口可以自定義調(diào)用初始化前后執(zhí)行的操作方法。
該接口中包含了兩個(gè)方法:before方法(預(yù)初始化)和after方法(后廚是化)
postProcessBeforeInitialization() 方法:在 Bean 實(shí)例化、屬性注入后,初始化前調(diào)用。
postProcessAfterInitialization() 方法:在 Bean 實(shí)例化、屬性注入、初始化都完成后調(diào)用。
二、案例
創(chuàng)建User類,為了更好的觀察bean周期執(zhí)行流程,在類中添加無(wú)參構(gòu)造器方法、setter注入方法、init()初始化方法和destory()銷毀方法,并在方法中都輸出一句話。代碼如下
/**
* 觀察bean周期執(zhí)行流程
*/
public class User {
String name;
int age;
//無(wú)參構(gòu)造方法
public User() {
System.out.println("這是無(wú)參構(gòu)造方法");
}
//setter方法
public void setName(String name) {
System.out.println("這是setter注入name");
this.name = name;
}
public void setAge(int age) {
System.out.println("這是setter注入age");
this.age = age;
}
//初始化回調(diào)方法
public void init() throws Exception {
System.out.println("這是初始化回調(diào)方法");
}
//銷毀回調(diào)方法
public void destroy() throws Exception {
System.out.println("這是銷毀回調(diào)方法");
}
//toString方法
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
創(chuàng)建PostProcessor類,實(shí)現(xiàn)BeanPostProcessor接口,并重寫(xiě)預(yù)初始化方法postProcessBeforeInitialization()和后初始化方法postProcessAfterInitialization()
/**
* Spring Bean后置處理器
*/
public class PostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+"正在執(zhí)行預(yù)初始化方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+"正在執(zhí)行后初始化方法");
return bean;
}
}
編寫(xiě)spring配置文件,添加bean
<!--添加user bean-->
<bean id="user" class="com.bighorn.pojo.User" init-method="init" destroy-method="destroy">
<property name="name" value="bighorn"/>
<property name="age" value="18"/>
</bean>
<!-- 注冊(cè)后置處理器 -->
<bean id="postProcessor" class="com.bighorn.config.PostProcessor"/>
編寫(xiě)運(yùn)行程序
public static void main(String[] args) {
//獲取 ClassPathXmlApplicationContext 容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//從容器中獲取對(duì)象
User user = context.getBean("user", User.class);
//使用bean
System.out.println("使用bean:"+user);
//調(diào)用close方法關(guān)閉容器
context.close();
}
運(yùn)行結(jié)果如下,通過(guò)結(jié)果我們可以清晰地看到bean生命周期執(zhí)行流程。

三、總結(jié)
實(shí)際開(kāi)發(fā)中,spring bean初始化操作比較少,一般采用后置處理器加工bean。
后置處理器有兩個(gè)方法:before和after方法。推薦使用after方法,即后初始化方法。
到此這篇關(guān)于詳解Spring中Bean后置處理器(BeanPostProcessor)的使用的文章就介紹到這了,更多相關(guān)SpringBean后置處理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中各種Controller的寫(xiě)法
這篇文章主要介紹了SpringBoot中各種Controller的寫(xiě)法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
interrupt()和線程終止方式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
線程的thread.interrupt()方法是中斷線程,將會(huì)設(shè)置該線程的中斷狀態(tài)位,即設(shè)置為true,中斷的結(jié)果線程是死亡、還是等待新的任務(wù)或是繼續(xù)運(yùn)行至下一步,就取決于這個(gè)程序本身2017-05-05
Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解
池化思想是一種空間換時(shí)間的思想,期望使用預(yù)先創(chuàng)建好的對(duì)象來(lái)減少頻繁創(chuàng)建對(duì)象的性能開(kāi)銷,java中有多種池化思想的應(yīng)用,例如:數(shù)據(jù)庫(kù)連接池、線程池等,下面就來(lái)具體講講2023-05-05
詳解IDEA 中使用Maven創(chuàng)建項(xiàng)目常見(jiàn)錯(cuò)誤和使用技巧(推薦)
這篇文章主要介紹了詳解IDEA 中使用Maven創(chuàng)建項(xiàng)目常見(jiàn)錯(cuò)誤和使用技巧(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類型)
這篇文章主要介紹了SpringBoot調(diào)第三方WebService接口的操作代碼(.wsdl與.asmx類型 ),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
淺談Java數(shù)組的一些使用方法及堆棧存儲(chǔ)
下面小編就為大家?guī)?lái)一篇淺談Java數(shù)組的一些使用方法及堆棧存儲(chǔ)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07

