?
目錄
一、作用域是什么?
1、singleton(單例作用域)
2、prototype(原型作用域)
3、request(請(qǐng)求作用域)
4、session(回話作用域)
5、application(全局作用域)
6、websocket( HTTP WebSocket 作用域)
二、單例作?域VS 全局作?域
三、設(shè)置作用域
一、作用域是什么?
Bean的作用域是指Bean實(shí)例的生命周期及可見(jiàn)性范圍,Spring框架定義了以下6種作用域:
- ?singleton:?jiǎn)卫饔糜颍袑?duì)該Bean的請(qǐng)求都返回同一個(gè)Bean實(shí)例。
- prototype:原型作用域,每次請(qǐng)求時(shí)都創(chuàng)建一個(gè)新的Bean實(shí)例。
- request:請(qǐng)求作用域,每個(gè)HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean實(shí)例,該Bean實(shí)例僅在當(dāng)前請(qǐng)求內(nèi)有效。
- ?session:會(huì)話作用域,每個(gè)HTTP會(huì)話都會(huì)創(chuàng)建一個(gè)新的Bean實(shí)例,該Bean實(shí)例僅在當(dāng)前會(huì)話內(nèi)有效。
- application:全局作用域,一個(gè)
bean
?定義對(duì)應(yīng)于單個(gè)ServletContext
?的生命周期。- websocket: HTTP WebSocket 作用域,一個(gè)
bean
?定義對(duì)應(yīng)于單個(gè)websocket
?的生命周期。選擇適當(dāng)?shù)淖饔糜蚩梢蕴岣邞?yīng)用程序的性能和可維護(hù)性。
?下面用一個(gè)例子來(lái)解釋Bean的作用域:你和別人一起協(xié)同開(kāi)發(fā)的代碼中有個(gè)Bean不想別人改動(dòng),那就可以通過(guò)調(diào)整Bean的作用域來(lái)解決.
下面有兩個(gè)用戶張三和李四,張三呢 調(diào)用了公共對(duì)象,但是張三特意使用了 user2來(lái)接收,
此時(shí)李四也想使用這個(gè)對(duì)象;然后他們一起調(diào)用了,但是發(fā)現(xiàn)李四調(diào)用的時(shí)候這個(gè)Name也被修改成小貓了.這是為什么呢 張三明顯創(chuàng)建了一個(gè)新對(duì)象
其實(shí)真實(shí)的情況是Spring的IoC容器有兩種作用域模式,一種是IoC默認(rèn)的singleton(單例作用域),一種是可手動(dòng)修改的prototype(原型作用域 / 多例作用域),在默認(rèn)情況下,IoC容器采用singleton,也就是所有人獲取到的都是同一個(gè)Bean對(duì)象,這樣效率會(huì)高很多.
所以當(dāng)我們使用原型模式時(shí)這個(gè)問(wèn)題就解決了
//張三
@Controller
public class UserController2 {
@Autowired
private User user;
public void doMethod() {
User user2 = user;
System.out.println("UserController2 修改之前:User -> " + user);
user2.setName("小貓");
System.out.println("UserController2 修改之后:User -> " + user);
}
}
//李四
@Controller
public class UserController3 {
@Autowired
private User user;
public void doMethod() {
System.out.println("UserController3:user -> " + user);
}
}
1、singleton(單例作用域)
- 官?說(shuō)明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
- 描述:該作?域下的Bean在IoC容器中只存在?個(gè)實(shí)例:獲取Bean(即通過(guò)applicationContext.getBean等?法獲?。┘把b配Bean(即通過(guò)@Autowired注?)都是同?個(gè)對(duì)象。
- 場(chǎng)景:通常?狀態(tài)的Bean使?該作?域。?狀態(tài)表示Bean對(duì)象的屬性狀態(tài)不需要更新
- ?備注:Spring默認(rèn)選擇該作?域
2、prototype(原型作用域)
- 官?說(shuō)明:Scopes a single bean definition to any number of object instances.
- 描述:每次對(duì)該作?域下的Bean的請(qǐng)求都會(huì)創(chuàng)建新的實(shí)例:獲取Bean(即通過(guò)applicationContext.getBean等?法獲?。┘把b配Bean(即通過(guò)@Autowired注?)都是新的對(duì)象實(shí)例。
- 場(chǎng)景:通常有狀態(tài)的Bean使?該作?域
上圖中,每個(gè)引用對(duì)應(yīng)一個(gè)新的
bean
實(shí)例。請(qǐng)注意,上圖中的例子不適用于生產(chǎn)環(huán)境。因?yàn)?code>DAO通常來(lái)說(shuō)是無(wú)狀態(tài)的
bean
,應(yīng)該指定它的作用域?yàn)?code>singleton比較合適
3、request(請(qǐng)求作用域)
- 官?說(shuō)明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
- 描述:每次http請(qǐng)求會(huì)創(chuàng)建新的Bean實(shí)例,類似于prototype
- 場(chǎng)景:?次http的請(qǐng)求和響應(yīng)的共享Bean
- 備注:限定SpringMVC中使?
4、session(回話作用域)
- 官?說(shuō)明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
- 描述:在?個(gè)http session中,定義?個(gè)Bean實(shí)例
- 場(chǎng)景:?戶回話的共享Bean, ?如:記錄?個(gè)?戶的登陸信息
- 備注:限定SpringMVC中使?
5、application(全局作用域)
- 官?說(shuō)明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
- 描述:在?個(gè)http servlet Context中,定義?個(gè)Bean實(shí)例
- 場(chǎng)景:Web應(yīng)?的上下?信息,?如:記錄?個(gè)應(yīng)?的共享信息
- 備注:限定SpringMVC中使?
6、websocket( HTTP WebSocket 作用域)
- 官?說(shuō)明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
- 描述:在?個(gè)HTTP WebSocket的?命周期中,定義?個(gè)Bean實(shí)例
- 場(chǎng)景:WebSocket的每次會(huì)話中,保存了?個(gè)Map結(jié)構(gòu)的頭信息,將?來(lái)包裹客戶端消息頭。第?次初始化后,直到WebSocket結(jié)束都是同?個(gè)Bean。
- 備注:限定Spring WebSocket中使?
二、單例作?域VS 全局作?域
- singleton 是 Spring Core 的作?域;application 是 Spring Web 中的作?域;
- singleton 作?于 IoC 的容器,? application 作?于 Servlet 容器。
三、設(shè)置作用域
singleton
作用域是Spring
中默認(rèn)的作用域,文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-694643.html
@Component
public class Users {
@Scope(prototype)
@Bean(name = "u")
public User user() {
User user = new User();
user.setId(1);
user.setName("Hi user");
return user;
}
}
1. 直接設(shè)置值:@Scope("prototype")2. 使?枚舉設(shè)置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-694643.html
到了這里,關(guān)于Bean 的六種作用域的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!