




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Spring注解驅(qū)動(dòng)之關(guān)于@Bean注解指定初始化和銷(xiāo)毀的方法目錄bean的生命周期如何定義初始化、銷(xiāo)毀方法初始化、銷(xiāo)毀方法的使用場(chǎng)景初始化、銷(xiāo)毀方法在Spring中的調(diào)用時(shí)機(jī)多實(shí)例bean初始化、銷(xiāo)毀
bean的生命周期
通常意義上講的bean的生命周期,指的是bean從創(chuàng)建到初始化,經(jīng)過(guò)一系列的流程,最終銷(xiāo)毀的過(guò)程。
只不過(guò),在Spring中,bean的生命周期是由Spring容器來(lái)管理的。
在Spring中,我們可以自己來(lái)指定bean的初始化和銷(xiāo)毀的方法。
我們指定了bean的初始化和銷(xiāo)毀方法之后,當(dāng)容器在bean進(jìn)行到當(dāng)前生命周期的階段時(shí),會(huì)自動(dòng)調(diào)用我們自定義的初始化和銷(xiāo)毀方法。
如何定義初始化、銷(xiāo)毀方法
可以通過(guò)@Bean注解指定初始化、銷(xiāo)毀方法。
如果使用XML配置文件的方式配置bean的話,那么可以在標(biāo)簽中指定bean的初始化和銷(xiāo)毀方法,如下所示:
beanid="person"init-method="init"destroy-method="destroy"
propertyname="age"value="18"/property
propertyname="name"value="liayun"/property
/bean
這里需要注意的是,我們自己寫(xiě)的Person類(lèi)中,需要存在init()方法和destroy()方法。而且Spring中還規(guī)定,這里的init()方法和destroy()方法必須是無(wú)參的,但可以拋出異常。
如果我們使用注解的方式,那么該如何實(shí)現(xiàn)指定bean的初始化和銷(xiāo)毀方法呢?
首先創(chuàng)建一個(gè)名稱(chēng)為Car的類(lèi),這個(gè)類(lèi)的實(shí)現(xiàn)比較簡(jiǎn)單,如下所示:
packagecom.meimeixia.bean;
publicclassCar{
publicCar(){
System.out.println("carconstructor...");
publicvoidinit(){
System.out.println("car...init...");
publicvoiddestroy(){
System.out.println("car...destroy...");
然后將Car類(lèi)對(duì)象通過(guò)注解的方式注冊(cè)到Spring容器中。
packagecom.meimeixia.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importcom.meimeixia.bean.Car;
@Configuration
publicclassMainConfigOfLifeCycle{
@Bean
publicCarcar(){
returnnewCar();
接著來(lái)寫(xiě)一個(gè)測(cè)試類(lèi)
packagecom.meimeixia.test;
importorg.junit.Test;
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
importcom.meimeixia.config.MainConfigOfLifeCycle;
publicclassIOCTest_LifeCycle{
@Test
publicvoidtest01(){
//1.創(chuàng)建IOC容器
AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器創(chuàng)建完成");
對(duì)于單實(shí)例bean對(duì)象來(lái)說(shuō),在Spring容器創(chuàng)建完成后,就會(huì)對(duì)單實(shí)例bean進(jìn)行實(shí)例化。
可以看到,在Spring容器創(chuàng)建完成時(shí),會(huì)自動(dòng)調(diào)用單實(shí)例bean的構(gòu)造方法,對(duì)單實(shí)例bean進(jìn)行了實(shí)例化操作。
總之,對(duì)應(yīng)單實(shí)例bean來(lái)說(shuō),會(huì)在Spring容器啟動(dòng)的時(shí)候創(chuàng)建對(duì)象;對(duì)于多實(shí)例bean來(lái)說(shuō),會(huì)在多次獲取bean的時(shí)候創(chuàng)建對(duì)象。
@Bean注解的initMethod和destroyMethod樹(shù)形來(lái)指定bean的初始化方法和銷(xiāo)毀方法。
所以我們?cè)谂渲妙?lèi)的@Bean注解中指定initMethod屬性和destroyMethod屬性。
packagecom.meimeixia.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importcom.meimeixia.bean.Car;
@Configuration
publicclassMainConfigOfLifeCycle{
@Bean(initMethod="init",destroyMethod="destroy")
publicCarcar(){
returnnewCar();
再次執(zhí)行測(cè)試方法。
在輸出結(jié)果中可以看出,在Spring容器中,先是調(diào)用了Car類(lèi)的構(gòu)造方法來(lái)創(chuàng)建Car對(duì)象,接下來(lái)便是調(diào)用了Car對(duì)象的init方法來(lái)進(jìn)行初始化。
這里有個(gè)問(wèn)題,在運(yùn)行測(cè)試方法的時(shí)候沒(méi)有打印出bean的銷(xiāo)毀方法中的信息,那么什么時(shí)候執(zhí)行bean的銷(xiāo)毀方法呢?bean的銷(xiāo)毀方法時(shí)在容器關(guān)閉的時(shí)候被調(diào)用的。
所以,在測(cè)試方法中添加關(guān)閉容器的代碼(注意關(guān)閉的容器的方法ApplicationContext沒(méi)有)。
packagecom.meimeixia.test;
importorg.junit.Test;
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
importcom.meimeixia.config.MainConfigOfLifeCycle;
publicclassIOCTest_LifeCycle{
@Test
publicvoidtest01(){
//1.創(chuàng)建IOC容器
AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器創(chuàng)建完成");
//關(guān)閉容器
applicationContext.close();
再次運(yùn)行測(cè)試方法。
可以看出,此時(shí)輸出了對(duì)象的銷(xiāo)毀方法中的信息,說(shuō)明執(zhí)行了對(duì)象的銷(xiāo)毀方法。
初始化、銷(xiāo)毀方法的使用場(chǎng)景
一個(gè)典型的場(chǎng)景就是對(duì)于數(shù)據(jù)源的管理。例如,在配置數(shù)據(jù)源時(shí),在初始化的時(shí)候,會(huì)對(duì)很多的數(shù)據(jù)源的屬性進(jìn)行賦值操作;在銷(xiāo)毀的時(shí)候,我們需要對(duì)數(shù)據(jù)源的連接等信息進(jìn)行關(guān)閉和清理。這個(gè)時(shí)候,我們就可以在自定義的初始化和銷(xiāo)毀方法中自定義操作邏輯。
初始化、銷(xiāo)毀方法在Spring中的調(diào)用時(shí)機(jī)
你有沒(méi)有想過(guò)這樣一個(gè)問(wèn)題,初始化方法和銷(xiāo)毀方法是在什么時(shí)候被調(diào)用的呢?
bean對(duì)象的初始化方法調(diào)用的時(shí)機(jī)
對(duì)象創(chuàng)建完成,如果對(duì)象中存在一些屬性,并且這些屬性也都已經(jīng)賦值了,那么就會(huì)調(diào)用bean的初始化方法。對(duì)于單實(shí)例bean來(lái)說(shuō),在Spring容器創(chuàng)建完成后,Spring容器會(huì)自動(dòng)調(diào)用bean的初始化方法;對(duì)應(yīng)多實(shí)例bean來(lái)說(shuō),在每次獲取bean對(duì)象的時(shí)候,調(diào)用bean的初始化方法。
bean對(duì)象的銷(xiāo)毀方法調(diào)用的時(shí)機(jī):對(duì)于單實(shí)例bean來(lái)說(shuō),在容器關(guān)閉的時(shí)候,會(huì)調(diào)用bean的銷(xiāo)毀方法;對(duì)于多實(shí)例bean來(lái)說(shuō),Spring容器只負(fù)責(zé)創(chuàng)建bean不會(huì)管理這些bean,也就不會(huì)自動(dòng)調(diào)用這個(gè)bean的銷(xiāo)毀方法了。小伙伴只能手動(dòng)調(diào)用多實(shí)例bean的銷(xiāo)毀方法了。
多實(shí)例bean初始化、銷(xiāo)毀
在配置類(lèi)上通過(guò)@Scope注解將Car對(duì)象設(shè)置成多實(shí)例bean。
packagecom.meimeixia.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.context.annotation.Scope;
importcom.meimeixia.bean.Car;
@Configuration
publicclassMainConfigOfLifeCycle{
@Scope("prototype")
@Bean(initMethod="init",destroyMethod="destroy")
publicCarcar(){
returnnewCar();
修改一下測(cè)試方法。
@Test
publicvoidtest01(){
//1.創(chuàng)建IOC容器
AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器創(chuàng)建完成");
運(yùn)行測(cè)試方法。
可以看到,將Car對(duì)象設(shè)置成多實(shí)例bean,并且沒(méi)有獲取bean實(shí)例對(duì)象時(shí),Spring容器并沒(méi)有執(zhí)行bean的構(gòu)造方法、初始化方法和銷(xiāo)毀方法。
如果我們?cè)跍y(cè)試方法獲取一下Car實(shí)例結(jié)果是什么樣呢?
可以看到,結(jié)果信息中輸出了構(gòu)造方法和初始化方法中的信息。
當(dāng)我們?cè)讷@取多實(shí)例bean對(duì)象的時(shí)候,會(huì)創(chuàng)建對(duì)象并進(jìn)行初始化,但是銷(xiāo)毀方法時(shí)在什么時(shí)候被調(diào)用呢?是在容器關(guān)閉的時(shí)候么?我們現(xiàn)在來(lái)驗(yàn)證一下。
@Test
publicvoidtest01(){
//1.創(chuàng)建IOC容器
AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器創(chuàng)建完成");
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 民間個(gè)人借款合同(集合15篇)
- 攀枝花輔警考試題庫(kù)2025(有答案)
- 能源行業(yè)智能監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)方案
- 慢性心力衰竭基層診療指南(2024年)
- 2025年內(nèi)蒙古中煤集團(tuán)鄂爾多斯山不拉煤礦校園招聘考試筆試試題(含答案)
- 海洋文化與經(jīng)濟(jì)融合發(fā)展路徑
- 老師的音樂(lè)課件
- 2025年氨基酸運(yùn)動(dòng)飲料食品市場(chǎng)分析報(bào)告
- 菜園土地流轉(zhuǎn)與農(nóng)業(yè)產(chǎn)業(yè)化合作合同
- 國(guó)企集團(tuán)公司各崗位廉潔風(fēng)險(xiǎn)點(diǎn)防控表格(廉政)范本
- 人事專(zhuān)員合同范本
- 山東省德州市禹城市2023-2024學(xué)年五年級(jí)下學(xué)期道德與法治期末檢測(cè)試題
- 2024年湖北普通高中學(xué)業(yè)水平選擇性考試地理真題解析(參考版)(解析版)
- 2023年湖北省高級(jí)人民法院及直屬法院招聘雇員制審判輔助人員考試真題
- 神經(jīng)內(nèi)科專(zhuān)科護(hù)士進(jìn)修匯報(bào)
- 危險(xiǎn)化學(xué)品應(yīng)急處置卡
- 金屬材料生物相容性研究
- 幕墻工程施工的重點(diǎn)難點(diǎn)分析及針對(duì)措施
- 新版人教版七年級(jí)全冊(cè)英語(yǔ)單詞表(含音標(biāo))可打印
- 人教版六年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)分層作業(yè)設(shè)計(jì)含答案
評(píng)論
0/150
提交評(píng)論