Spring注解@Scope原理及用法解析
主要從以下幾方面來(lái)介紹一下@Scope注解
- @Scope注解是什么
- @Scope注解怎么使用
- @Scope注解的使用場(chǎng)景
1,@Scope注解是什么
@Scope注解是springIoc容器中的一個(gè)作用域,在 Spring IoC 容器中具有以下幾種作用域:基本作用域singleton(單例)、prototype(多例),Web 作用域(reqeust、session、globalsession),自定義作用域
a.singleton單例模式 -- 全局有且僅有一個(gè)實(shí)例
b.prototype原型模式 -- 每次獲取Bean的時(shí)候會(huì)有一個(gè)新的實(shí)例
c.request -- request表示該針對(duì)每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean,同時(shí)該bean僅在當(dāng)前HTTP request內(nèi)有效
d.session -- session作用域表示該針對(duì)每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean,同時(shí)該bean僅在當(dāng)前HTTP session內(nèi)有效
e.globalsession -- global session作用域類似于標(biāo)準(zhǔn)的HTTP Session作用域,不過(guò)它僅僅在基于portlet的web應(yīng)用中才有意義
2,@Scope注解怎么使用
直接在bean對(duì)象方法上增加@Scope注解就可以如下:
/**
* 定義一個(gè)bean對(duì)象
* @return
*/
@Scope
@Bean(value="user0",name="user0",initMethod="initUser",destroyMethod="destroyUser")
public User getUser(){
System.out.println("創(chuàng)建user實(shí)例");
return new User("張三",26);
}
@Scope注解默認(rèn)的singleton實(shí)例,singleton實(shí)例的意思不管你使用多少次在springIOC容器中只會(huì)存在一個(gè)實(shí)例,演示如下只打印了一次創(chuàng)建實(shí)例:
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
User bean2 = applicationContext2.getBean(User.class);
System.out.println("實(shí)例1 === "+bean2);
User bean3 = applicationContext2.getBean(User.class);
System.out.println("實(shí)例2 === "+bean3);
創(chuàng)建user實(shí)例
實(shí)例1 === User [userName=張三, age=26]
實(shí)例2 === User [userName=張三, age=26]
接下來(lái)把實(shí)例類型改為prototype如下:
@Scope(value="prototype")
運(yùn)行結(jié)果如下:
創(chuàng)建user實(shí)例
實(shí)例1 === User [userName=張三, age=26]
創(chuàng)建user實(shí)例
實(shí)例2 === User [userName=張三, age=26]
注:這邊只演示了我們常用的兩種作用域,其他的大家可以下去自己試試
3,@Scope注解的使用場(chǎng)景
幾乎90%以上的業(yè)務(wù)使用singleton單實(shí)例就可以,所以spring默認(rèn)的類型也是singleton,singleton雖然保證了全局是一個(gè)實(shí)例,對(duì)性能有所提高,但是如果實(shí)例中有非靜態(tài)變量時(shí),會(huì)導(dǎo)致線程安全問(wèn)題,共享資源的競(jìng)爭(zhēng)
當(dāng)設(shè)置為prototype時(shí):每次連接請(qǐng)求,都會(huì)生成一個(gè)bean實(shí)例,也會(huì)導(dǎo)致一個(gè)問(wèn)題,當(dāng)請(qǐng)求數(shù)越多,性能會(huì)降低,因?yàn)閯?chuàng)建的實(shí)例,導(dǎo)致GC頻繁,gc時(shí)長(zhǎng)增加
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
idea如何在service窗口中顯示多個(gè)服務(wù)
這篇文章主要介紹了idea如何在service窗口中顯示多個(gè)服務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問(wèn)題解決
這篇文章主要介紹了Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java通過(guò)jedis連接redis的幾種常用方法
jedis封裝了redis原有的操作命令,使用起來(lái)很簡(jiǎn)單,本文主要介紹了Java通過(guò)jedis連接redis的幾種常用方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
SpringBoot?Admin集成診斷利器Arthas示例實(shí)現(xiàn)
這篇文章主要為大家介紹了SpringBoot?Admin集成診斷利器Arthas示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Java接入微信支付超級(jí)詳細(xì)保姆級(jí)教程
這篇文章主要給大家介紹了關(guān)于Java接入微信支付的相關(guān)資料,包括l 準(zhǔn)備開(kāi)發(fā)所需的賬號(hào)和配置信息、準(zhǔn)備環(huán)境、設(shè)置開(kāi)發(fā)參數(shù)以及實(shí)現(xiàn)支付接口,回調(diào)地址的設(shè)置和異步回調(diào)通知的處理也是文章的重點(diǎn)內(nèi)容,需要的朋友可以參考下2024-12-12

