一文搞懂Spring中Bean的生命周期
生命周期:從創(chuàng)建到消亡的完整過程
bean聲明周期:bean從創(chuàng)建到銷毀的整體過程
bean聲明周期控制:在bean創(chuàng)建后到銷毀前做一些事情
一、使用配置生命周期的方法
在BookDaoImpl中實(shí)現(xiàn)類中創(chuàng)建相應(yīng)的方法:
//表示bean初始化對(duì)應(yīng)的操作
public void init(){
System.out.println("init...");
}
//表示bean銷毀前對(duì)應(yīng)的操作
public void destory(){
System.out.println("destory...");
}
applicationContext.xml配置初始化聲明周期回調(diào)函數(shù)及銷毀聲明周期回調(diào)函數(shù)
<!--init-method:設(shè)置bean初始化生命周期回調(diào)函數(shù)-->
<!--destroy-method:設(shè)置bean銷毀生命周期回調(diào)函數(shù),僅適用于單例對(duì)象-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
執(zhí)行結(jié)果:

虛擬機(jī)退出,沒有給bean銷毀的機(jī)會(huì)。
可利用ClassPathXmlApplictionContext里的close方法主動(dòng)關(guān)閉容器,就會(huì)執(zhí)行銷毀方法。
import com.itheima.dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForLifeCycle {
public static void main( String[] args ) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//關(guān)閉容器
ctx.close();
}
}
執(zhí)行結(jié)果:

不過這種方式比較暴力,容器還提供另外的方法
在AppForLifeCycle中用關(guān)閉鉤子函數(shù)
//注冊(cè)關(guān)閉鉤子函數(shù),在虛擬機(jī)退出之前回調(diào)此函數(shù),關(guān)閉容器
ctx.registerShutdownHook();
執(zhí)行結(jié)果:

關(guān)閉鉤子在任何時(shí)間都可以執(zhí)行,close關(guān)閉比較暴力。
二、生命周期控制——接口控制(了解)
applicationContext.xml配置:
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
BookServiceImpl:
可以利用接口InitializingBean和DisposableBean來設(shè)置初始化和銷毀后的方法設(shè)置
import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
System.out.println("set .....");
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
public void destroy() throws Exception {
System.out.println("service destroy");
}
public void afterPropertiesSet() throws Exception {
System.out.println("service init");
}
}
執(zhí)行結(jié)果:

可以看出set在執(zhí)行在init的執(zhí)行之后,當(dāng)你的屬性設(shè)置完以后,才去執(zhí)行afterPropertiesSet,所有才叫afterPropertiesSet,在屬性設(shè)置之后。
小結(jié)
生命周期總結(jié)
初始化容器
- 1、創(chuàng)建對(duì)象
- 2、執(zhí)行構(gòu)造方法
- 3、執(zhí)行屬性注入(set操作)
- 4、執(zhí)行bean初始化方法
使用bean
執(zhí)行業(yè)務(wù)操作
關(guān)閉/銷毀容器
執(zhí)行bean操作
1、bean生命周期控制
配置
init-method
destroy-method
接口(了解)
InitializingBean
DisposableBean
2、關(guān)閉容器
ConfigurableApplicationContext
close()
registerShutdownHook()
到此這篇關(guān)于一文搞懂Spring中Bean的生命周期的文章就介紹到這了,更多相關(guān)Spring Bean生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?HttpURLConnection使用方法與實(shí)例演示分析
這篇文章主要介紹了Java?HttpURLConnection使用方法與實(shí)例演示,HttpURLConnection一個(gè)抽象類是標(biāo)準(zhǔn)的JAVA接口,該類位于java.net包中,它提供了基本的URL請(qǐng)求,響應(yīng)等功能,下面我們來深入看看2023-10-10
JAVA基礎(chǔ)之注解與反射的使用方法和場(chǎng)景
這篇文章主要給大家介紹了關(guān)于JAVA基礎(chǔ)之注解與反射的使用方法和場(chǎng)景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
微服務(wù)通過Feign調(diào)用進(jìn)行密碼安全認(rèn)證操作
這篇文章主要介紹了微服務(wù)通過Feign調(diào)用進(jìn)行密碼安全認(rèn)證操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java更新調(diào)度器(update scheduler)的使用詳解
Java更新調(diào)度器是Java中的一個(gè)特性,可以自動(dòng)化Java應(yīng)用程序的更新過程,它提供了一種方便的方式來安排Java應(yīng)用程序的更新,確保其與最新的功能、錯(cuò)誤修復(fù)和安全補(bǔ)丁保持同步,本文將深入介紹如何使用Java更新調(diào)度器,并解釋它對(duì)Java開發(fā)人員和用戶的好處2023-11-11

