前言
為了鞏固所學(xué)的知識,作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯誤,歡迎讀者朋友們批評指正。
(博客的參考源碼以及可以在我主頁的資源里找到,如果在學(xué)習(xí)的過程中有什么疑問歡迎大家在評論區(qū)向我提出)
發(fā)現(xiàn)寶藏
前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家?!緦毑厝肟凇?。
1. 理解bean的生命周期
- 生命周期: 從創(chuàng)建到消亡的完整過程;bean生命周期 : bean從創(chuàng)建到銷毀的整體過程; bean生命周期控制:在bean創(chuàng)建后到銷毀前做一些事情
- 理解 Spring bean 的生命周期很容易。當(dāng)一個 bean 被實例化時,它可能需要執(zhí)行一些初始化使它轉(zhuǎn)換成可用狀態(tài)。同樣,當(dāng) bean 不再需要,并且從容器中移除時,可能需要做一些清除工作
- 盡管還有一些在 Bean 實例化和銷毀之間發(fā)生的活動,有兩個重要的生命周期回調(diào)方法,它們在 bean 的初始化和銷毀的時候是必需的
- 為了定義安裝和拆卸一個 bean,我們只要聲明帶有 init-method 和/或 destroy-method 參數(shù)的 。init-method 屬性指定一個方法,在實例化 bean 時,立即調(diào)用該方法。同樣,destroy-method 指定一個方法,只有從容器中移除 bean 之后,才能調(diào)用該方法
- Bean的生命周期可以表達(dá)為:Bean的定義——Bean的初始化——Bean的使用——Bean的銷毀
2. Bean 生命周期的執(zhí)行過程
- 根據(jù)配置情況調(diào)用 Bean 構(gòu)造方法或工廠方法實例化 Bean
- 利用依賴注入完成 Bean 中所有屬性值的配置注入
- 如果 Bean 實現(xiàn)了 BeanNameAware 接口,則 Spring 調(diào)用 Bean 的 setBeanName() 方法傳入當(dāng)前 Bean 的 id 值
- 如果 Bean 實現(xiàn)了 BeanFactoryAware 接口,則 Spring 調(diào)用 setBeanFactory() 方法傳入當(dāng)前工廠實例的引用
- 如果 Bean 實現(xiàn)了 ApplicationContextAware 接口,則 Spring 調(diào)用 setApplicationContext() 方法傳入當(dāng)前 ApplicationContext 實例的引用
- 如果 BeanPostProcessor 和 Bean 關(guān)聯(lián),則 Spring 將調(diào)用該接口的預(yù)初始化方法 postProcessBeforeInitialzation() 對 Bean 進(jìn)行加工操作,此處非常重要,Spring 的 AOP 就是利用它實現(xiàn)的
- 如果 Bean 實現(xiàn)了 InitializingBean 接口,則 Spring 將調(diào)用 afterPropertiesSet() 方法
- 如果在配置文件中通過 init-method 屬性指定了初始化方法,則調(diào)用該初始化方法
- 如果 BeanPostProcessor 和 Bean 關(guān)聯(lián),則 Spring 將調(diào)用該接口的初始化方法 postProcessAfterInitialization()。此時,Bean 已經(jīng)可以被應(yīng)用系統(tǒng)使用了
- 如果在 中指定了該 Bean 的作用范圍為 scope=“singleton”,則將該 Bean 放入 Spring IoC 的緩存池中,將觸發(fā) Spring 對該 Bean 的生命周期管理;如果在 中指定了該 Bean 的作用范圍為 scope=“prototype”,則將該 Bean 交給調(diào)用者,調(diào)用者管理該 Bean 的生命周期,Spring 不再管理該 Bean
- 如果 Bean 實現(xiàn)了 DisposableBean 接口,則 Spring 會調(diào)用 destory() 方法將 Spring 中的 Bean 銷毀;如果在配置文件中通過 destory-method 屬性指定了 Bean 的銷毀方法,則 Spring 將調(diào)用該方法對 Bean 進(jìn)行銷毀
- Spring 為 Bean 提供了細(xì)致全面的生命周期過程,通過實現(xiàn)特定的接口或 的屬性設(shè)置,都可以對 Bean 的生命周期過程產(chǎn)生影響。雖然可以隨意配置 的屬性,但是建議不要過多地使用 Bean 實現(xiàn)接口,因為這樣會導(dǎo)致代碼和 Spring 的聚合過于緊密
3. Bean生命周期控制入門案例
1. 編寫代碼(IOC 和 DI入門案例的代碼,模塊名為respr_ioc)
- 在BookDaoImpl實現(xiàn)類中定義代表創(chuàng)建bena初始化和銷毀的方法
package org.example.dao.impl;
import org.example.dao.BookDao;
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
//表示bean初始化對應(yīng)的操作
public void init(){
System.out.println("init...");
}
//表示bean銷毀前對應(yīng)的操作
public void destory(){
System.out.println("destory...");
}
}
2. 在applicationContext.xml文件中配置BookDao bean 的 初始化方法 int-method 和銷毀方法 destory-method
3. 將BookService的代碼注釋掉,運行模擬測試類,觀察BookDao bean的創(chuàng)建和銷毀過程
4. 觀察運行結(jié)果
5. 簡要分析
- 我們從運行結(jié)果可以看到bean初始化成功了,但是并沒有進(jìn)行銷毀工作,原因是java虛擬機(java在虛擬機運行)在執(zhí)行玩程序退出時并沒有做銷毀操作,我們需要自己添加關(guān)閉語句,ctx.close()。
- 但是ApplicationContext接口中并沒有這個方法,而它的實現(xiàn)類中有,所以我們要用它的實現(xiàn)類ClassPathXmlApplicationContext來調(diào)用這個方法
4. 關(guān)閉IOC容器的兩種方式
1. 關(guān)閉ioc容器的代碼及運行結(jié)果如下
2. 關(guān)閉ioc容器的第二種方式:關(guān)閉鉤子(概念、代碼及運行結(jié)果如下)
- 在Java程序退出時——尤其是非正常退出時,我們可能需要先執(zhí)行一些善后工作,如關(guān)閉線程池、連接池、文件句柄等。
- 如何保證善后工作的代碼能夠被執(zhí)行到呢?Java為用戶提供了關(guān)閉鉤子(shutdown hook)registerShutdownHook()方法來注冊關(guān)閉鉤子
3. 兩種關(guān)閉ioc容器的簡要分析
關(guān)閉鉤子函數(shù)代碼在程序中的位置要求沒有close()方法那么苛刻,如果將其挪到bookDao.save()方法的下面也能用,close()方法比較暴力
5. 通過繼承接口綁定生命周期方法
1. 綁定銷毀方法和初始化方法的改進(jìn)–繼承接口(以BookServiceImpl為例)
- 實現(xiàn)InitializingBean, DisposableBean接口
- 重寫 destroy(銷毀) 和 afterPropertiesSet(初始化) 方法
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
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");
}
}
2. 模擬測試類Main2運行結(jié)果
盡管在模擬測試類Main2并沒有調(diào)用BookService 的bean,但是在核心配置文件中定義了BookService 的 bean,該創(chuàng)建bean的時候就創(chuàng)建,該初始化就初始化,該銷毀就銷毀
文章來源:http://www.zghlxwxcb.cn/news/detail-618517.html
總結(jié)
歡迎各位留言交流以及批評指正,如果文章對您有幫助或者覺得作者寫的還不錯可以點一下關(guān)注,點贊,收藏支持一下。
(博客的參考源碼可以在我主頁的資源里找到,如果在學(xué)習(xí)的過程中有什么疑問歡迎大家在評論區(qū)向我提出)文章來源地址http://www.zghlxwxcb.cn/news/detail-618517.html
到了這里,關(guān)于Spring Bean的生命周期 -- Spring入門(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!