最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文搞懂Spring Bean中的作用域和生命周期

 更新時(shí)間:2022年06月11日 09:32:04   作者:倔強(qiáng)的牛角  
Spring作為當(dāng)前Java最流行、最強(qiáng)大的輕量級框架,受到了程序員的熱烈歡迎。了解Spring?Bean的作用域與生命周期是非常必要的,快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧

一、Spring Bean 作用域

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

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

singleton(單例)

  • singleton是Spring默認(rèn)的作用域。當(dāng) Bean 的作用域?yàn)?singleton 時(shí),Spring IoC 容器中只會(huì)存在一個(gè)共享的 Bean 實(shí)例??梢愿玫刂赜脤ο螅?jié)省重復(fù)創(chuàng)建對象的開銷。
  • 設(shè)置方式:將 <bean> 元素的 scope 屬性設(shè)置為singleton(其實(shí)也可以不用設(shè)置,因?yàn)閟pring默認(rèn)就是單例模式)

案例1

1.創(chuàng)建Dept類

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

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

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

3.編寫運(yùn)行程序

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.結(jié)果如下,可以發(fā)現(xiàn)打印出的是同一個(gè)對象

prototype(原型)

  • prototype表示原型(非單例)模式。當(dāng) Bean 的作用域?yàn)?prototype時(shí),Spring 容器會(huì)在每次請求該 Bean 時(shí),都創(chuàng)建一個(gè)新的 Bean 實(shí)例。
  • 設(shè)置方式:將 <bean> 元素的 scope 屬性設(shè)置為prototype

案例2

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

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

2.運(yùn)行結(jié)果如下

小結(jié)

spring bean默認(rèn)為單例,避免了對象的頻繁創(chuàng)建與銷毀,達(dá)到了bean對象的復(fù)用,性能高。

像表現(xiàn)層、業(yè)務(wù)層、數(shù)據(jù)層、工具類對象只需要調(diào)用方法,比較適合交給Spring IoC容器管理

但是像那種需要封裝實(shí)例的域?qū)ο?,因?yàn)闀?huì)引發(fā)線程安全問題,不適合交給Spring IoC容器管理。

二、Spring Bean生命周期

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

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

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

  • 對于 singleton 作用域的 Bean ,Spring IoC 容器能夠一直追蹤bean的生命周期;
  • 對于 prototype 作用域的 Bean ,Spring IoC 容器只負(fù)責(zé)創(chuàng)建,然后就將 Bean 的實(shí)例交給客戶端代碼管理,Spring IoC 容器將不再跟蹤其生命周期。

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

如何關(guān)閉容器

由于ApplicationContext類中沒有關(guān)閉容器的方法,所以想要關(guān)閉容器需要用到ApplicationContext的子類——ClassPathXmlApplicationContext類。該類又有兩種方法可以關(guān)閉容器

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

close()方法,在調(diào)用的時(shí)候關(guān)閉容器

//獲取 ClassPathXmlApplicationContext 容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//調(diào)用close方法關(guān)閉容器
context.close();

2、注冊鉤子關(guān)閉容器

registerShutdownHook()方法,在JVM退出前調(diào)用關(guān)閉容器

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

生命周期回調(diào)

Bean 的生命周期回調(diào)方法主要有兩種:

  • 初始化回調(diào)方法:在 Spring Bean 被初始化后調(diào)用,執(zhí)行一些自定義的回調(diào)操作。
  • 銷毀回調(diào)方法:在 Spring Bean 被銷毀前調(diào)用,執(zhí)行一些自定義的回調(diào)操作。

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

  • 通過接口實(shí)現(xiàn)
  • 通過 XML 配置實(shí)現(xiàn)

通過接口設(shè)置生命周期

我們可以在 Spring Bean 的 Java 類中,通過實(shí)現(xiàn) InitializingBeanDisposableBean 接口,指定 Bean 的生命周期回調(diào)方法。

案例1

1.創(chuàng)建User類,并實(shí)現(xiàn)InitializingBean, DisposableBean接口,重寫afterPropertiesSet()destroy()方法。代碼如下

/**
 * 繼承接口,程序初始化回調(diào)和銷毀回調(diào)方法
 */
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;
    }

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

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

    //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.編寫運(yùn)行程序

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);
        //調(diào)用close方法關(guān)閉容器
        context.close();
    }
}

4.運(yùn)行結(jié)果如下

通過xml設(shè)置生命周期

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

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

案例2

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

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

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

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

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

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

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

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

<!--通過XML配置指定回調(diào)方法-->
<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.運(yùn)行程序和運(yùn)行結(jié)果都與案例1相同,這里就少些筆墨介紹了

到此這篇關(guān)于一文搞懂Spring Bean中的作用域和生命周期的文章就介紹到這了,更多相關(guān)Spring Bean作用域 生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java文件刪除不了的坑,特別是壓縮文件問題

    java文件刪除不了的坑,特別是壓縮文件問題

    這篇文章主要介紹了java文件刪除不了的坑,特別是壓縮文件問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • spring boot 錯(cuò)誤頁面配置解決方案

    spring boot 錯(cuò)誤頁面配置解決方案

    這篇文章主要介紹了spring boot 錯(cuò)誤頁面配置解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringBatch從入門到精通之StepScope作用域和用法詳解

    SpringBatch從入門到精通之StepScope作用域和用法詳解

    這篇文章主要介紹了SpringBatch從入門到精通之StepScope作用域和用法詳解,主要包括IOC容器中幾種bean的作用范圍以及可能遇到的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Java字母加數(shù)字組合比較大小

    Java字母加數(shù)字組合比較大小

    這篇文章主要通過實(shí)現(xiàn)Comarable接口來比較(如"a20"和"a9"這種)字符串的大小,希望能給大家做一個(gè)參考。
    2016-06-06
  • Java中絕對值函數(shù)的介紹與其妙用

    Java中絕對值函數(shù)的介紹與其妙用

    這篇文章主要給大家介紹了Java中絕對值函數(shù)的介紹與其妙用,其中包括絕對值函數(shù)用來獲取表達(dá)式的絕對值和絕對值函數(shù)實(shí)現(xiàn)降序+升序輸出。文章末尾給出了實(shí)例介紹,有需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。
    2017-01-01
  • Spring?Boot項(xiàng)目Jar包加密實(shí)戰(zhàn)教程

    Spring?Boot項(xiàng)目Jar包加密實(shí)戰(zhàn)教程

    本文詳細(xì)介紹了如何在Spring?Boot項(xiàng)目中實(shí)現(xiàn)Jar包加密,我們首先了解了Jar包加密的基本概念和作用,然后學(xué)習(xí)了如何使用Spring?Boot的Jar工具和第三方庫來實(shí)現(xiàn)Jar包的加密和解密,感興趣的朋友一起看看吧
    2024-02-02
  • Spring整合MyBatis(Maven+MySQL)圖文教程詳解

    Spring整合MyBatis(Maven+MySQL)圖文教程詳解

    這篇文章主要介紹了Spring整合MyBatis(Maven+MySQL)圖文教程詳解的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • spring mvc+localResizeIMG實(shí)現(xiàn)HTML5端圖片壓縮上傳

    spring mvc+localResizeIMG實(shí)現(xiàn)HTML5端圖片壓縮上傳

    這篇文章主要為大家詳細(xì)介紹了使用spring mvc+localResizeIMG實(shí)現(xiàn)HTML5端圖片壓縮上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

    spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

    這篇文章主要給大家介紹了關(guān)于spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java中Instant的使用及轉(zhuǎn)換

    Java中Instant的使用及轉(zhuǎn)換

    Instant是java.time包中的一個(gè)類,本文主要介紹了Java中Instant的使用及轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06

最新評論

新闻| 临颍县| 清水县| 尤溪县| 固原市| 临夏县| 舒城县| 澄迈县| 潼南县| 金塔县| 如皋市| 长海县| 乌拉特中旗| 油尖旺区| 新河县| 铜梁县| 六安市| 开原市| 缙云县| 分宜县| 从化市| 乾安县| 山东省| 宿松县| 布尔津县| 许昌市| 维西| 丽江市| 阿拉善左旗| 江都市| 水富县| 黑水县| 多伦县| 宜章县| 珲春市| 琼中| 普洱| 舟曲县| 德安县| 依安县| 田阳县|