欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java開(kāi)發(fā)學(xué)習(xí)之Bean的生命周期詳解

 更新時(shí)間:2022年06月16日 08:15:12   作者:|舊市拾荒|  
從創(chuàng)建到消亡的完整過(guò)程,例如人從出生到死亡的整個(gè)過(guò)程就是一個(gè)生命周期。本文將通過(guò)示例為大家詳細(xì)講講Bean的生命周期,感興趣的可以學(xué)習(xí)一下

一、什么是生命周期

首先理解下什么是生命周期?

從創(chuàng)建到消亡的完整過(guò)程,例如人從出生到死亡的整個(gè)過(guò)程就是一個(gè)生命周期。

bean生命周期是什么?

bean對(duì)象從創(chuàng)建到銷(xiāo)毀的整體過(guò)程。

bean生命周期控制是什么?

在bean創(chuàng)建后到銷(xiāo)毀前做一些事情。

二、環(huán)境準(zhǔn)備

環(huán)境搭建:

  • 創(chuàng)建一個(gè)Maven項(xiàng)目
  • pom.xml添加依賴(lài)
  • resources下添加spring的配置文件applicationContext.xml

最終項(xiàng)目的結(jié)構(gòu)如下:

(1)項(xiàng)目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl類(lèi)

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)編寫(xiě)AppForLifeCycle運(yùn)行類(lèi),加載Spring的IOC容器,并從中獲取對(duì)應(yīng)的bean對(duì)象

public class AppForLifeCycle {
 ? ?public static void main( String[] args ) {
 ? ? ? ?ApplicationContext ctx = new 
 ? ? ?      ClassPathXmlApplicationContext("applicationContext.xml");
 ? ? ? ?BookDao bookDao = (BookDao) ctx.getBean("bookDao");
 ? ? ? ?bookDao.save();
 ?  }
}

三、生命周期設(shè)置

接下來(lái),在上面這個(gè)環(huán)境中來(lái)為BookDao添加生命周期的控制方法,具體的控制有兩個(gè)階段:

  • bean創(chuàng)建之后,想要添加內(nèi)容,比如用來(lái)初始化需要用到資源
  • bean銷(xiāo)毀之前,想要添加內(nèi)容,比如用來(lái)釋放用到的資源

步驟1:添加初始化和銷(xiāo)毀方法

針對(duì)這兩個(gè)階段,我們?cè)贐ooDaoImpl類(lèi)中分別添加兩個(gè)方法,方法名任意

public class BookDaoImpl implements BookDao {
 ? ?public void save() {
 ? ? ? ?System.out.println("book dao save ...");
 ?  }
 ? ?//表示bean初始化對(duì)應(yīng)的操作
 ? ?public void init(){
 ? ? ? ?System.out.println("init...");
 ?  }
 ? ?//表示bean銷(xiāo)毀前對(duì)應(yīng)的操作
 ? ?public void destory(){
 ? ? ? ?System.out.println("destory...");
 ?  }
}

步驟2:配置生命周期

在配置文件添加配置,如下:

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

步驟3:運(yùn)行程序

運(yùn)行AppForLifeCycle打印結(jié)果為:

從結(jié)果中可以看出,init方法執(zhí)行了,但是destroy方法卻未執(zhí)行,這是為什么呢?

  • Spring的IOC容器是運(yùn)行在JVM中
  • 運(yùn)行main方法后,JVM啟動(dòng),Spring加載配置文件生成IOC容器,從容器獲取bean對(duì)象,然后調(diào)方法執(zhí)行
  • main方法執(zhí)行完后,JVM退出,這個(gè)時(shí)候IOC容器中的bean還沒(méi)有來(lái)得及銷(xiāo)毀就已經(jīng)結(jié)束了
  • 所以沒(méi)有調(diào)用對(duì)應(yīng)的destroy方法

知道了出現(xiàn)問(wèn)題的原因,具體該如何解決呢?

四、close關(guān)閉容器

ApplicationContext中沒(méi)有close方法

需要將ApplicationContext更換成ClassPathXmlApplicationContext

ClassPathXmlApplicationContext ctx = new 
 ? ?ClassPathXmlApplicationContext("applicationContext.xml");

調(diào)用ctx的close()方法

ctx.close();

運(yùn)行程序,就能執(zhí)行destroy方法的內(nèi)容

這種方式比較暴力,直接就關(guān)閉掉容器了,接下來(lái)介紹另一種方式,

五、注冊(cè)鉤子關(guān)閉容器

在容器未關(guān)閉之前,提前設(shè)置好回調(diào)函數(shù),讓JVM在退出之前回調(diào)此函數(shù)來(lái)關(guān)閉容器

調(diào)用ctx的registerShutdownHook()方法

是全局變量,方法放置位置無(wú)所謂

ctx.registerShutdownHook();

注意:registerShutdownHook在ApplicationContext中也沒(méi)有

運(yùn)行后,查詢打印結(jié)果

兩種方式介紹完后,close和registerShutdownHook選哪個(gè)?

相同點(diǎn):這兩種都能用來(lái)關(guān)閉容器

不同點(diǎn):close()是在調(diào)用的時(shí)候關(guān)閉,registerShutdownHook()是在JVM退出前調(diào)用關(guān)閉。

分析上面的實(shí)現(xiàn)過(guò)程,會(huì)發(fā)現(xiàn)添加初始化和銷(xiāo)毀方法,即需要編碼也需要配置,實(shí)現(xiàn)起來(lái)步驟比較多也比較亂。

Spring提供了兩個(gè)接口來(lái)完成生命周期的控制,好處是可以不用再進(jìn)行配置init-methoddestroy-method

接下來(lái)在BookServiceImpl完成這兩個(gè)接口的使用:

修改BookServiceImpl類(lèi),添加兩個(gè)接口InitializingBean, DisposableBean并實(shí)現(xiàn)接口中的兩個(gè)方法afterPropertiesSetdestroy

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");
 ?  }
}

重新運(yùn)行AppForLifeCycle類(lèi)

那第二種方式的實(shí)現(xiàn),我們也介紹完了。

小細(xì)節(jié)

對(duì)于InitializingBean接口中的afterPropertiesSet方法,翻譯過(guò)來(lái)為屬性設(shè)置之后。

對(duì)于BookServiceImpl來(lái)說(shuō),bookDao是它的一個(gè)屬性

setBookDao方法是Spring的IOC容器為其注入屬性的方法

思考:afterPropertiesSet和setBookDao誰(shuí)先執(zhí)行?

從方法名分析,猜想應(yīng)該是setBookDao方法先執(zhí)行

驗(yàn)證思路,在setBookDao方法中添加一句話

public void setBookDao(BookDao bookDao) {
 ? ? ? ?System.out.println("set .....");
 ? ? ? ?this.bookDao = bookDao;
 ?  }
?

重新運(yùn)行AppForLifeCycle,打印結(jié)果如下:

驗(yàn)證的結(jié)果和我們猜想的結(jié)果是一致的,所以初始化方法會(huì)在類(lèi)中屬性設(shè)置之后執(zhí)行。

六、bean生命周期總結(jié)

(1)關(guān)于Spring中對(duì)bean生命周期控制提供了兩種方式:

  • 在配置文件中的bean標(biāo)簽中添加init-methoddestroy-method屬性
  • 類(lèi)實(shí)現(xiàn)InitializingBeanDisposableBean接口。

(2)對(duì)于bean的生命周期控制在bean的整個(gè)生命周期中所處的位置如下:

初始化容器

  • 1.創(chuàng)建對(duì)象(內(nèi)存分配)
  • 2.執(zhí)行構(gòu)造方法
  • 3.執(zhí)行屬性注入(set操作)
  • 4.執(zhí)行bean初始化方法

使用bean

  • 1.執(zhí)行業(yè)務(wù)操作

關(guān)閉/銷(xiāo)毀容器

  • 1.執(zhí)行bean銷(xiāo)毀方

(3)關(guān)閉容器的兩種方式:

ConfigurableApplicationContext是ApplicationContext的子類(lèi)

  • close()方法
  • registerShutdownHook()方法

到此這篇關(guān)于Java開(kāi)發(fā)學(xué)習(xí)之Bean的生命周期詳解的文章就介紹到這了,更多相關(guān)Bean生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java引用jpython的方法示例

    java引用jpython的方法示例

    這篇文章主要介紹了java引用jpython的方法,結(jié)合實(shí)例形式分析了java引用jpython及相關(guān)使用技巧,需要的朋友可以參考下
    2016-11-11
  • java網(wǎng)上圖書(shū)商城(2)Category模塊

    java網(wǎng)上圖書(shū)商城(2)Category模塊

    這篇文章主要介紹了java網(wǎng)上圖書(shū)商城,Category模塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Spring5路徑匹配器PathPattern解析

    Spring5路徑匹配器PathPattern解析

    這篇文章主要介紹了Spring5路徑匹配器PathPattern,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java 獲取上一個(gè)月的月份的正確寫(xiě)法

    Java 獲取上一個(gè)月的月份的正確寫(xiě)法

    這篇文章主要介紹了java獲取上一個(gè)月月份,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Java線程中斷interrupt的常用方法

    Java線程中斷interrupt的常用方法

    本文主要介紹了Java線程中斷interrupt的常用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • JAVA異常信息Exception?e及e的相關(guān)方法解讀

    JAVA異常信息Exception?e及e的相關(guān)方法解讀

    這篇文章主要介紹了JAVA異常信息Exception?e及e的相關(guān)方法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java實(shí)現(xiàn)基于SGIP協(xié)議開(kāi)發(fā)聯(lián)通短信的方法

    java實(shí)現(xiàn)基于SGIP協(xié)議開(kāi)發(fā)聯(lián)通短信的方法

    這篇文章主要介紹了java實(shí)現(xiàn)基于SGIP協(xié)議開(kāi)發(fā)聯(lián)通短信的方法,涉及java短信發(fā)送的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java中try catch 的基本用法示例

    Java中try catch 的基本用法示例

    這篇文章主要給大家介紹了關(guān)于Java中try catch 的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • java實(shí)現(xiàn)模仿斗地主發(fā)牌

    java實(shí)現(xiàn)模仿斗地主發(fā)牌

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)模仿斗地主發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 解決mybatis where-if中if不能識(shí)別大寫(xiě)AND,OR的問(wèn)題

    解決mybatis where-if中if不能識(shí)別大寫(xiě)AND,OR的問(wèn)題

    這篇文章主要介紹了解決mybatis where-if中if不能識(shí)別大寫(xiě)AND,OR的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論