本篇內容主要講解“Java之Bean的生命周期實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java之Bean的生命周期實例分析”吧!
首先理解下什么是生命周期?
從創建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。
bean生命周期是什么?
bean對象從創建到銷毀的整體過程。
bean生命周期控制是什么?
在bean創建后到銷毀前做一些事情。
環境搭建:
創建一個Maven項目
pom.xml添加依賴
resources下添加spring的配置文件applicationContext.xml
最終項目的結構如下:
(1)項目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl類
public interface BookDao { public void save(); } public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } } public interface BookService { public void save(); } public class BookServiceImpl implements BookService{ private BookDao bookDao; public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } public void save() { System.out.println("book service save ..."); bookDao.save(); } }
(2)resources下提供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 id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> </beans>
(3)編寫AppForLifeCycle運行類,加載Spring的IOC容器,并從中獲取對應的bean對象
public class AppForLifeCycle { public static void main( String[] args ) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); BookDao bookDao = (BookDao) ctx.getBean("bookDao"); bookDao.save(); } }
接下來,在上面這個環境中來為BookDao添加生命周期的控制方法,具體的控制有兩個階段:
bean創建之后,想要添加內容,比如用來初始化需要用到資源
bean銷毀之前,想要添加內容,比如用來釋放用到的資源
針對這兩個階段,我們在BooDaoImpl類中分別添加兩個方法,方法名任意
public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } //表示bean初始化對應的操作 public void init(){ System.out.println("init..."); } //表示bean銷毀前對應的操作 public void destory(){ System.out.println("destory..."); } }
在配置文件添加配置,如下:
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
運行AppForLifeCycle打印結果為:
從結果中可以看出,init方法執行了,但是destroy方法卻未執行,這是為什么呢?
Spring的IOC容器是運行在JVM中
運行main方法后,JVM啟動,Spring加載配置文件生成IOC容器,從容器獲取bean對象,然后調方法執行
main方法執行完后,JVM退出,這個時候IOC容器中的bean還沒有來得及銷毀就已經結束了
所以沒有調用對應的destroy方法
知道了出現問題的原因,具體該如何解決呢?
ApplicationContext中沒有close方法
需要將ApplicationContext更換成ClassPathXmlApplicationContext
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
調用ctx的close()方法
ctx.close();
運行程序,就能執行destroy方法的內容
這種方式比較暴力,直接就關閉掉容器了,接下來介紹另一種方式,
在容器未關閉之前,提前設置好回調函數,讓JVM在退出之前回調此函數來關閉容器
調用ctx的registerShutdownHook()方法
是全局變量,方法放置位置無所謂
ctx.registerShutdownHook();
注意:registerShutdownHook在ApplicationContext中也沒有
運行后,查詢打印結果
兩種方式介紹完后,close和registerShutdownHook選哪個?
相同點:這兩種都能用來關閉容器
不同點:close()是在調用的時候關閉,registerShutdownHook()是在JVM退出前調用關閉。
分析上面的實現過程,會發現添加初始化和銷毀方法,即需要編碼也需要配置,實現起來步驟比較多也比較亂。
Spring提供了兩個接口來完成生命周期的控制,好處是可以不用再進行配置init-method
和destroy-method
接下來在BookServiceImpl完成這兩個接口的使用:
修改BookServiceImpl類,添加兩個接口InitializingBean
, DisposableBean
并實現接口中的兩個方法afterPropertiesSet
和destroy
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"); } }
重新運行AppForLifeCycle類
那第二種方式的實現,我們也介紹完了。
小細節
對于InitializingBean接口中的afterPropertiesSet方法,翻譯過來為屬性設置之后。
對于BookServiceImpl來說,bookDao是它的一個屬性
setBookDao方法是Spring的IOC容器為其注入屬性的方法
思考:afterPropertiesSet和setBookDao誰先執行?
從方法名分析,猜想應該是setBookDao方法先執行
驗證思路,在setBookDao方法中添加一句話
public void setBookDao(BookDao bookDao) { System.out.println("set ....."); this.bookDao = bookDao; }
重新運行AppForLifeCycle,打印結果如下:
驗證的結果和我們猜想的結果是一致的,所以初始化方法會在類中屬性設置之后執行。
(1)關于Spring中對bean生命周期控制提供了兩種方式:
在配置文件中的bean標簽中添加init-method
和destroy-method
屬性
類實現InitializingBean
與DisposableBean
接口。
(2)對于bean的生命周期控制在bean的整個生命周期中所處的位置如下:
初始化容器
1.創建對象(內存分配)
2.執行構造方法
3.執行屬性注入(set操作)
4.執行bean初始化方法
使用bean
1.執行業務操作
關閉/銷毀容器
1.執行bean銷毀方法
(3)關閉容器的兩種方式:
ConfigurableApplicationContext是ApplicationContext的子類
close()方法
registerShutdownHook()方法
到此,相信大家對“Java之Bean的生命周期實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。