中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Spring?Bean中的作用域和生命周期實例分析

發布時間:2022-06-13 10:41:55 來源:億速云 閱讀:183 作者:zzz 欄目:開發技術

這篇文章主要介紹“Spring Bean中的作用域和生命周期實例分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring Bean中的作用域和生命周期實例分析”文章能幫助大家解決問題。

一、Spring Bean 作用域

常規的 Spring IoC 容器中Bean的作用域有兩種:singleton(單例)和prototype(非單例)

注:基于Web的容器還有其他種作用域,在這就不贅述了。

singleton(單例)

  • singleton是Spring默認的作用域。當 Bean 的作用域為 singleton 時,Spring IoC 容器中只會存在一個共享的 Bean 實例。可以更好地重用對象,節省重復創建對象的開銷。

  • 設置方式:將 <bean> 元素的 scope 屬性設置為singleton(其實也可以不用設置,因為spring默認就是單例模式)

案例1

1.創建Dept類

public class Dept {
    //部門編號
    private int deptNo;
    //部門名稱
    private String deptName;
}

2.編寫Spring配置文件,并將scope 屬性設置為singleton

<bean id="dept" class="com.bighorn.pojo.Dept" scope="singleton">
</bean>

3.編寫運行程序

public static void main(String[] args) {
    //獲取IoC容器
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //從容器中獲取對象
    Dept dept1 = context.getBean("dept", Dept.class);
    Dept dept2 = context.getBean("dept", Dept.class);
    //打印對象
    System.out.println(dept1);
    System.out.println(dept2);
}

4.結果如下,可以發現打印出的是同一個對象

Spring?Bean中的作用域和生命周期實例分析

prototype(原型)

  • prototype表示原型(非單例)模式。當 Bean 的作用域為 prototype時,Spring 容器會在每次請求該 Bean 時,都創建一個新的 Bean 實例。

  • 設置方式:將 <bean> 元素的 scope 屬性設置為prototype

案例2

1.只需修改scope 屬性為prototype,其他代碼不變。

<bean id="dept" class="com.bighorn.pojo.Dept" scope="prototype">
</bean>

2.運行結果如下

Spring?Bean中的作用域和生命周期實例分析

小結

spring bean默認為單例,避免了對象的頻繁創建與銷毀,達到了bean對象的復用,性能高。

像表現層、業務層、數據層、工具類對象只需要調用方法,比較適合交給Spring IoC容器管理

但是像那種需要封裝實例的域對象,因為會引發線程安全問題,不適合交給Spring IoC容器管理。

二、Spring Bean生命周期

Spring Bean生命周期:Spring Bean 對象從創建到銷毀的整體過程。

Spring Bean生命周期大致可以分為以下 5 個階段:1.Bean 的實例化、2.Bean 屬性賦值、3.Bean 的初始化、4.Bean 的使用、5.Bean 的銷毀

Spring 根據 Bean 的作用域來選擇 Bean 的管理方式。

  • 對于 singleton 作用域的 Bean ,Spring IoC 容器能夠一直追蹤bean的生命周期;

  • 對于 prototype 作用域的 Bean ,Spring IoC 容器只負責創建,然后就將 Bean 的實例交給客戶端代碼管理,Spring IoC 容器將不再跟蹤其生命周期。

綜上所述: 為了更好研究如何控制bean周期,下面案例中創建的bean默認都使用單例模式。

如何關閉容器

由于ApplicationContext類中沒有關閉容器的方法,所以想要關閉容器需要用到ApplicationContext的子類&mdash;&mdash;ClassPathXmlApplicationContext類。該類又有兩種方法可以關閉容器

1、close關閉容器

close()方法,在調用的時候關閉容器

//獲取 ClassPathXmlApplicationContext 容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//調用close方法關閉容器
context.close();

2、注冊鉤子關閉容器

registerShutdownHook()方法,在JVM退出前調用關閉容器

//獲取 ClassPathXmlApplicationContext 容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//調用注冊狗子關閉容器
context.registerShutdownHook();

生命周期回調

Bean 的生命周期回調方法主要有兩種:

  • 初始化回調方法:在 Spring Bean 被初始化后調用,執行一些自定義的回調操作。

  • 銷毀回調方法:在 Spring Bean 被銷毀前調用,執行一些自定義的回調操作。

我們可以通過以下 2種方式自定義 Bean 的生命周期回調方法:

  • 通過接口實現

  • 通過 XML 配置實現

通過接口設置生命周期

我們可以在 Spring Bean 的 Java 類中,通過實現 InitializingBeanDisposableBean 接口,指定 Bean 的生命周期回調方法。

案例1

1.創建User類,并實現InitializingBean, DisposableBean接口,重寫afterPropertiesSet()destroy()方法。代碼如下

/**
 * 繼承接口,程序初始化回調和銷毀回調方法
 */
public class User implements InitializingBean, DisposableBean {
    String name;
    int age;

    //setter方法
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //初始化回調方法
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("這是初始化回調方法");
    }

    //銷毀回調方法
    @Override
    public void destroy() throws Exception {
        System.out.println("這是銷毀回調方法");
    }

    //toString方法
    @Override
    public String toString() {
        return "User{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
}

2.編寫spring配置文件

<bean id="user" class="com.bighorn.pojo.User">
    <property name="name" value="bighorn"/>
    <property name="age" value="18"/>
</bean>

3.編寫運行程序

public class App {
    public static void main(String[] args) {
        //獲取 ClassPathXmlApplicationContext 容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //從容器中獲取對象
        User user = context.getBean("user", User.class);
        //使用bean
        System.out.println(user);
        //調用close方法關閉容器
        context.close();
    }
}

4.運行結果如下

Spring?Bean中的作用域和生命周期實例分析

通過xml設置生命周期

注意:由于通過接口設置生命周期的方式會導致代碼的耦合性過高,所以通常情況下,我們會通過xml設置生命周期。

通過 <bean> 元素中的 init-methoddestory-method 屬性,指定 Bean 的生命周期回調方法。

案例2

1.創建User類,這次不需要繼承那兩個接口了,但要在添加兩個普通方法(方法名可任意):init()destory()代表初始化和銷毀方法。代碼如下

/**
 * 通過XML配置指定回調方法
 */
public class User {
    String name;
    int age;

    //setter方法
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //初始化回調方法
    public void init() throws Exception {
        System.out.println("這是初始化回調方法");
    }

    //銷毀回調方法
    public void destroy() throws Exception {
        System.out.println("這是銷毀回調方法");
    }

    //toString方法
    @Override
    public String toString() {
        return "User{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
}

2.編寫spring配置文件,在<bean>元素里添加init-methoddestroy-method屬性,并指定User類中自定義的init和destory方法(關鍵)

<!--通過XML配置指定回調方法-->
<bean id="user" class="com.bighorn.pojo.User" init-method="init" destroy-method="destroy">
    <property name="name" value="bighorn"/>
    <property name="age" value="18"/>
</bean>

3.運行程序和運行結果都與案例1相同,這里就少些筆墨介紹了

關于“Spring Bean中的作用域和生命周期實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

AI

台南市| 同仁县| 中卫市| 德钦县| 外汇| 雷州市| 龙口市| 海门市| 无极县| 信宜市| 泽州县| 利川市| 朝阳市| 宝兴县| 灵石县| 全椒县| 旺苍县| 女性| 集贤县| 平果县| 南木林县| 京山县| 始兴县| 南汇区| 茶陵县| 洛扎县| 黔西县| 余江县| 荣成市| 黄骅市| 托里县| 纳雍县| 长宁县| 赣州市| 阜阳市| 西青区| 电白县| 洮南市| 河东区| 光山县| 泰来县|