在沒有任何附加的條件下,Spring創建對象的方式是單例模式,也就是說不管在什么地方注入多少次,使用的都是同一個bean。有時候這種模式並不能滿足我們的需求。
@Scope注解可以聲明創建bean的方式,以及bean的作用域。它可以與@Bean、@Component注解一起使用。看個例子:
//ConfigurableBeanFactory.SCOPE_PROTOTYPE:原型模式,每次注入bean時都重新創建對象 //ConfigurableBeanFactory.SCOPE_SINGLETON:單例模式,上下文中永遠只有一個bean @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) Homework homework(){ return new Homework("1+2 = ?"); }
另外,在一些應用場景下,我們會希望bean是有作用范圍的。比如說:購物車對象,每個用戶都應該有屬於自己的購物車,並且每次web會話中,購物車是不變的。對於一個用戶來說,每個對購物車的添加、刪除商品操作都是同一個購物車,而每個用戶只能操作自己的購物車。
這就不得不提一下@Scope的另外的參數:WebApplicationContext.SCOPE_SESSION、WebApplicationContext.SCOPE_REQUEST。使用這兩個值作為@Scope的參數,會創建出基於會話的bean、基於請求的bean。即每個會話創建一個bean、每個請求創建一個bean。當然了,對於web應用來說,光指定這個參數還不夠還需要設置@Scope的proxyMode屬性。就像下圖的例子:
關於這個proxyMode是什么作用,你可以查閱相關資料,或者翻看《Spring實戰第四版》,這本書的鏈接:https://pan.baidu.com/s/1P9mV1PdHC1BhfHY9Dj3ngw 提取碼:f9jo。使用xml配置方式也可以做scope相關設置。
你有沒有想過將外部配置文件的字段注入到bean的屬性里面?比如數據庫信息。Spring為這提供了很好的實現方式:創建一個PropertySourcesPlaceholderConfigurer 類的bean,同時給它設定你的.properties文件的位置,就可以通過"${xxx.xxx}"占位符的方式訪問了。對於這塊如果看得有點迷糊,你可以在網上找一些例子,其實很簡單,或者在評論區給我留言。
如果這篇文章有幫到你,歡迎收藏、關注、點贊。