- Spring Boot進(jìn)階:原理、實(shí)戰(zhàn)與面試題分析
- 鄭天民
- 584字
- 2022-07-05 09:41:44
2.4.1 把握Bean的作用域
在介紹Setter方法注入時,我們已經(jīng)提到了Spring中的Bean作用域的概念。作用域描述了Bean在Spring IoC容器上下文中的生命周期和可見性。在這里,我們將討論Spring框架中不同類型的Bean作用域及其在使用上的指導(dǎo)規(guī)則。
如果想要通過注解來設(shè)置Bean的作用域,可以使用如代碼清單2-26所示的示例代碼。
代碼清單2-26 設(shè)置Bean作用域示例代碼
@Configuration public class AppConfig { @Bean @Scope("singleton") public HealthRecordService createHealthRecordService() { return new HealthRecordServiceImpl(); } }
可以看到這里使用了一個@Scope注解來指定Bean的作用域?yàn)閱卫膕ingleton。在Spring中,除了單例作用域之外,還有一個prototype,即原型作用域,也可以稱之為多例作用域,以與單例作用域進(jìn)行區(qū)別。使用方式上,我們同樣可以使用如代碼清單2-27所示的枚舉值來對它們進(jìn)行設(shè)置。
代碼清單2-27 通過枚舉值設(shè)置作用域代碼
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
在Spring IoC容器中,Bean的默認(rèn)作用域是單例,也就是說不管有多少個對Bean的引用,容器只會創(chuàng)建一個實(shí)例。而原型作用域則不同,每次請求Bean時,Spring IoC容器都會創(chuàng)建一個新的對象實(shí)例。
從兩種作用域的效果而言,我們總結(jié)出一條開發(fā)上的經(jīng)驗(yàn),即對于有狀態(tài)的Bean,我們應(yīng)該使用原型作用域,反之則應(yīng)該使用單例作用域。
那么,什么樣的Bean是有狀態(tài)的呢?結(jié)合Web應(yīng)用程序,我們可以明確對于每次HTTP請求而言,我們都應(yīng)該創(chuàng)建一個Bean來代表這一次的請求對象。同樣,對于會話而言,我們也需要針對每個會話創(chuàng)建一個會話狀態(tài)對象。這些都是常見的有狀態(tài)的Bean。為了更好地管理這些Bean的生命周期,Spring還專門針對Web開發(fā)場景提供了對應(yīng)的request和session作用域。
- Oracle WebLogic Server 12c:First Look
- Mastering Adobe Captivate 2017(Fourth Edition)
- Rust實(shí)戰(zhàn)
- Reactive Programming with Swift
- PostgreSQL技術(shù)內(nèi)幕:事務(wù)處理深度探索
- 數(shù)據(jù)庫系統(tǒng)原理及MySQL應(yīng)用教程
- 小學(xué)生C++創(chuàng)意編程(視頻教學(xué)版)
- 前端HTML+CSS修煉之道(視頻同步+直播)
- 大數(shù)據(jù)分析與應(yīng)用實(shí)戰(zhàn):統(tǒng)計機(jī)器學(xué)習(xí)之?dāng)?shù)據(jù)導(dǎo)向編程
- Android移動開發(fā)案例教程:基于Android Studio開發(fā)環(huán)境
- ABAQUS6.14中文版有限元分析與實(shí)例詳解
- HTML并不簡單:Web前端開發(fā)精進(jìn)秘籍
- HTML5程序設(shè)計基礎(chǔ)教程
- Flink原理深入與編程實(shí)戰(zhàn):Scala+Java(微課視頻版)
- Java語言程序設(shè)計與實(shí)現(xiàn)(微課版)