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

Spring中的@Scope注解詳細講解及示例

 更新時間:2023年11月24日 09:51:59   作者:扛麻袋的少年  
這篇文章主要介紹了Spring中的@Scope注解詳細講解及示例,@Scope注解是 Spring IOC 容器中的一個作用域,在 Spring IOC 容器中,他用來配置Bean實例的作用域?qū)ο?需要的朋友可以參考下

1.@Scope注解是什么

@Scope注解是 Spring IOC 容器中的一個作用域,在 Spring IOC 容器中,他用來配置Bean實例的作用域?qū)ο蟆?/p>

@Scope 具有以下幾種作用域:

  • singleton 單實例的(單例)(默認)   ----全局有且僅有一個實例
  • prototype 多實例的(多例)   ---- 每次獲取Bean的時候會有一個新的實例
  • reqeust    同一次請求 ----request:每一次HTTP請求都會產(chǎn)生一個新的bean,同時該bean僅在當前HTTP request內(nèi)有效
  • session    同一個會話級別 ---- session:每一次HTTP請求都會產(chǎn)生一個新的bean,同時該bean僅在當前HTTP session內(nèi)有效

注:這邊只演示我們常用的 singleton、prototype 兩種,其他的可以自己試試

2.@Scope注解怎么使用

直接在bean對象方法上增加@Scope注解即可。

① 在不指定@Scope的情況下,所有的bean都是單實例的bean,而且是餓漢模式加載(容器啟動實例就創(chuàng)建好了)

@Bean 
public Person person() { 
	return new Person(); 
}

②指定@Scope為 prototype 表示為多實例的,而且還是懶漢模式加載(IOC容器啟動的時候,并不會創(chuàng)建對象,而是 在第一次使用的時候才會創(chuàng)建)

@Bean 
@Scope(value = "prototype") 
public Person person() { 
	return new Person(); 
}

3.singleton/prototype模式演示

/**
 * Person類
 */ 
public class Person {
	// Person類無參構(gòu)造方法
    public Person() {
        System.out.println("執(zhí)行Person構(gòu)造器創(chuàng)建Person對象");
    }
}
/**
 * TODO 主配置類
 *
 * @author : lzb
 * @date: 2021-03-05 13:50
 */
@Configuration
public class BeanConfig {

    @Bean
    @Scope(value = "singleton")
    public Person person(){
        return new Person();
    }
}

3.1 singleton單例演示

@Scope注解默認為singleton單例,singleton實例的意思不管你使用多少次在springIOC容器中只會存在一個實例,演示如下只打印了一次創(chuàng)建實例:

public class DemoApplication {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(BeanConfig.class);
        Person person = ac.getBean(Person.class);
        Person person2 = ac.getBean(Person.class);
        System.out.println(person);
        System.out.println(person2);
        System.out.println(person == person2);
    }
}

執(zhí)行結(jié)果:

在這里插入圖片描述

可以發(fā)現(xiàn)singleton單例模式,在IOC容器中只會有一個實例存在,每次getBean()獲取的實例對象都是同一個。

3.2 prototype多例演示

/**
 * TODO 主配置類
 *
 * @author : lzb
 * @date: 2021-03-05 13:50
 */
@Configuration
public class BeanConfig {

    @Bean
    @Scope(value = "prototype")
    public Person person(){
        return new Person();
    }
}

執(zhí)行結(jié)果:

在這里插入圖片描述

發(fā)現(xiàn)prototype多例模式,每次在調(diào)用getBean() 獲取實例時,都會重新調(diào)用 Person 類的無參構(gòu)造方法,重新創(chuàng)建一個 Person 對象。

4.惡漢/懶漢

使用singleton單例,采用餓漢加載(容器啟動,Bean實例就創(chuàng)建好了)

使用prototype多例,采用懶漢加載(IOC容器啟動的時候,并不會創(chuàng)建對象實例,而是在第一次使用的時候才會創(chuàng)建)

4.1 singleton 惡漢

演示

/**
 * TODO 主配置類
 *
 * @author : lzb
 * @date: 2021-03-05 13:50
 */
@Configuration
public class BeanConfig {

    @Bean
    @Scope(value = "singleton")
    public Person person(){
        return new Person();
    }
}
public class DemoApplication {

    public static void main(String[] args) {
    	// 啟動Spring IOC容器
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(BeanConfig.class);
    }
}

執(zhí)行結(jié)果:

在這里插入圖片描述

singleton單例模式,在 IOC 容器啟動時,便會去調(diào)用 Person 類的無參構(gòu)造方法,創(chuàng)建一個 Person 對象。此時并沒有調(diào)用 getBean() 方法來獲取Person 對象實例。

所以singleton 采用的是 惡漢式 創(chuàng)建實例對象

注:如何將 singleton 單例模式的 惡漢式 變更為 懶漢式,只需要再添加一個 @Lazy 注解即可。 如下所示:

@Configuration
public class BeanConfig {

    @Bean
    @Scope
    @Lazy
    public Person person(){
        return new Person();
    }
}

4.2 prototype 懶漢

演示

/**
 * TODO 主配置類
 *
 * @author : lzb
 * @date: 2021-03-05 13:50
 */
@Configuration
public class BeanConfig {

    @Bean
    @Scope(value = "prototype")
    public Person person(){
        return new Person();
    }
}
public class DemoApplication {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(BeanConfig.class);
        System.out.println("=================IOC容器啟動成功==============");
        Person person = ac.getBean(Person.class);
        System.out.println(person);
    }
}

執(zhí)行結(jié)果:

在這里插入圖片描述

prototype多例模式,在 IOC 容器啟動時,并不會去創(chuàng)建Bean實例,只有在調(diào)用 getBean() 方法獲取Person 對象時,才會去調(diào)用 Person 類的無參構(gòu)造方法,創(chuàng)建一個 Person 對象。

所以 prototype 采用的是 懶漢式 創(chuàng)建實例對象

5.Bean實例對象的銷毀

針對單實例bean的話,容器啟動的時候,bean的對象就創(chuàng)建了,而且容器銷毀的時候,也會調(diào)用Bean的銷毀方法;

針對多實例bean的話,容器啟動的時候,bean是不會被創(chuàng)建的而是在獲取bean的時候被創(chuàng)建,而且bean的銷毀不受IOC容器的管理,是由GC來處理的

針對每一個Bean實例,都會有一個initMethod() 和 destroyMethod() 方法,我們可以在Bean 類中自行定義,也可以使用 Spring 默認提供的這兩個方法。

public class Person {

    public Person() {
        System.out.println("執(zhí)行Person構(gòu)造器創(chuàng)建Person對象");
    }

    public void init() {
        System.out.println("initMethod");
    }

    public void destroy() {
        System.out.println("destroyMethod");
    }
}
@Configuration
public class BeanConfig {

    @Bean(initMethod = "init", destroyMethod = "destroy")   // 可以自己指定方法名,也可以不指定,使用Spring默認提供的方法
    @Scope(value = "singleton")
    public Person person(){
        return new Person();
    }
}

singleton單例,在IOC容器銷毀時,就會調(diào)用 destroyMethod() 方法來將 Bean對象銷毀;prototype多例,它的Bean實例對象則不受IOC容器的管理,最終由GC來銷毀。

6.@Scope注解的使用場景

幾乎90%以上的業(yè)務使用 singleton單例就可以,所以 Spring 默認的類型也是singleton,singleton雖然保證了全局是一個實例,對性能有所提高,但是如果實例中有非靜態(tài)變量時,會導致線程安全問題,共享資源的競爭。

當設置為prototype多例時:每次連接請求,都會生成一個bean實例,也會導致一個問題,當請求數(shù)越多,性能會降低,因為創(chuàng)建的實例,導致GC頻繁,GC時長增加。

到此這篇關(guān)于Spring中的@Scope注解詳細講解及示例的文章就介紹到這了,更多相關(guān)Spring中的@Scope注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot實用配置詳細圖文教程

    springboot實用配置詳細圖文教程

    SpringBoot從本質(zhì)上來說就是Spring,它通過了一些自己的特性幫助我們簡化了Spring應用程序的開發(fā),下面這篇文章主要給大家介紹了關(guān)于springboot實用配置的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Java中自旋鎖與CAS機制的深層關(guān)系與區(qū)別

    Java中自旋鎖與CAS機制的深層關(guān)系與區(qū)別

    CAS算法即比較并替換,是一種實現(xiàn)并發(fā)編程時常用到的算法,Java并發(fā)包中的很多類都使用了CAS算法,這篇文章主要介紹了Java中自旋鎖與CAS機制深層關(guān)系與區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2025-11-11
  • Java實現(xiàn)樹形菜單的方法總結(jié)

    Java實現(xiàn)樹形菜單的方法總結(jié)

    當我們想要展示層級結(jié)構(gòu),如文件目錄、組織結(jié)構(gòu)或分類目錄時,樹形菜單是一個直觀且有效的解決方案,本文為大家整理了java中幾種常見方法,希望對大家有所幫助
    2023-08-08
  • java多線程Synchronized實現(xiàn)可見性原理解析

    java多線程Synchronized實現(xiàn)可見性原理解析

    這篇文章主要介紹了java多線程Synchronized實現(xiàn)可見性原理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • spring是如何實現(xiàn)聲明式事務的

    spring是如何實現(xiàn)聲明式事務的

    這篇文章主要介紹了spring是如何實現(xiàn)聲明式事務的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • SpringBoot中@Autowired與@Resource的區(qū)別小結(jié)

    SpringBoot中@Autowired與@Resource的區(qū)別小結(jié)

    本文主要介紹了SpringBoot中@Autowired與@Resource的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • Spring?myBatis數(shù)據(jù)庫連接異常問題及解決

    Spring?myBatis數(shù)據(jù)庫連接異常問題及解決

    這篇文章主要介紹了Spring?myBatis數(shù)據(jù)庫連接異常問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java實現(xiàn)二叉樹的示例代碼(遞歸&迭代)

    Java實現(xiàn)二叉樹的示例代碼(遞歸&迭代)

    二叉樹(Binary?tree)是樹形結(jié)構(gòu)的一個重要類型。本文將利用Java語言實現(xiàn)二叉樹,文中的示例代碼講解詳細,需要的同學可以參考一下
    2022-03-03
  • Java 常用類解析:java異常機制,異常棧,異常處理方式,異常鏈,異常丟失詳解

    Java 常用類解析:java異常機制,異常棧,異常處理方式,異常鏈,異常丟失詳解

    這篇文章主要介紹了Java 常用類解析:java異常機制,異常棧,異常處理方式,異常鏈,異常丟失詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Servlet注解之@WebInitParam多個InitParam的使用

    Servlet注解之@WebInitParam多個InitParam的使用

    這篇文章主要介紹了Servlet注解之@WebInitParam多個InitParam的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論

宁武县| 日照市| 德兴市| 葫芦岛市| 通州市| 屯门区| 丹江口市| 静乐县| 苗栗市| 故城县| 揭东县| 木兰县| 阳江市| 盖州市| 阜宁县| 武义县| 林口县| 嘉善县| 运城市| 千阳县| 淳化县| 大足县| 仙游县| 清河县| 麟游县| 巨野县| 资阳市| 仙居县| 洛川县| 彰化县| 彭山县| 翁牛特旗| 八宿县| 田东县| 新巴尔虎左旗| 鹰潭市| 南部县| 新河县| 华容县| 镇沅| 岫岩|