溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java之Bean的生命周期實例分析

發布時間:2022-06-16 10:27:06 來源:億速云 閱讀:184 作者:zzz 欄目:開發技術

本篇內容主要講解“Java之Bean的生命周期實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java之Bean的生命周期實例分析”吧!

    一、什么是生命周期

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

    從創建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。

    bean生命周期是什么?

    bean對象從創建到銷毀的整體過程。

    bean生命周期控制是什么?

    在bean創建后到銷毀前做一些事情。

    二、環境準備

    環境搭建:

    • 創建一個Maven項目

    • pom.xml添加依賴

    • resources下添加spring的配置文件applicationContext.xml

    最終項目的結構如下:

    Java之Bean的生命周期實例分析

    (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銷毀之前,想要添加內容,比如用來釋放用到的資源

    步驟1:添加初始化和銷毀方法

    針對這兩個階段,我們在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...");
        }
    }

    步驟2:配置生命周期

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

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

    步驟3:運行程序

    運行AppForLifeCycle打印結果為:

    Java之Bean的生命周期實例分析

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

    • Spring的IOC容器是運行在JVM中

    • 運行main方法后,JVM啟動,Spring加載配置文件生成IOC容器,從容器獲取bean對象,然后調方法執行

    • main方法執行完后,JVM退出,這個時候IOC容器中的bean還沒有來得及銷毀就已經結束了

    • 所以沒有調用對應的destroy方法

    知道了出現問題的原因,具體該如何解決呢?

    四、close關閉容器

    ApplicationContext中沒有close方法

    需要將ApplicationContext更換成ClassPathXmlApplicationContext

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

    調用ctx的close()方法

    ctx.close();

    運行程序,就能執行destroy方法的內容

    Java之Bean的生命周期實例分析

    這種方式比較暴力,直接就關閉掉容器了,接下來介紹另一種方式,

    五、注冊鉤子關閉容器

    在容器未關閉之前,提前設置好回調函數,讓JVM在退出之前回調此函數來關閉容器

    調用ctx的registerShutdownHook()方法

    是全局變量,方法放置位置無所謂

    ctx.registerShutdownHook();

    注意:registerShutdownHook在ApplicationContext中也沒有

    運行后,查詢打印結果

    Java之Bean的生命周期實例分析

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

    相同點:這兩種都能用來關閉容器

    不同點:close()是在調用的時候關閉,registerShutdownHook()是在JVM退出前調用關閉。

    分析上面的實現過程,會發現添加初始化和銷毀方法,即需要編碼也需要配置,實現起來步驟比較多也比較亂。

    Spring提供了兩個接口來完成生命周期的控制,好處是可以不用再進行配置init-methoddestroy-method

    接下來在BookServiceImpl完成這兩個接口的使用:

    修改BookServiceImpl類,添加兩個接口InitializingBean, DisposableBean并實現接口中的兩個方法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");
        }
    }

    重新運行AppForLifeCycle類

    Java之Bean的生命周期實例分析

    那第二種方式的實現,我們也介紹完了。

    小細節

    對于InitializingBean接口中的afterPropertiesSet方法,翻譯過來為屬性設置之后。

    對于BookServiceImpl來說,bookDao是它的一個屬性

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

    思考:afterPropertiesSet和setBookDao誰先執行?

    從方法名分析,猜想應該是setBookDao方法先執行

    驗證思路,在setBookDao方法中添加一句話

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

    重新運行AppForLifeCycle,打印結果如下:

    Java之Bean的生命周期實例分析

    驗證的結果和我們猜想的結果是一致的,所以初始化方法會在類中屬性設置之后執行。

    六、bean生命周期總結

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

    • 在配置文件中的bean標簽中添加init-methoddestroy-method屬性

    • 類實現InitializingBeanDisposableBean接口。

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

    初始化容器

    • 1.創建對象(內存分配)

    • 2.執行構造方法

    • 3.執行屬性注入(set操作)

    • 4.執行bean初始化方法

    使用bean

    • 1.執行業務操作

    關閉/銷毀容器

    • 1.執行bean銷毀方

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

    ConfigurableApplicationContext是ApplicationContext的子類

    • close()方法

    • registerShutdownHook()方法

    到此,相信大家對“Java之Bean的生命周期實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女