Bean的六大作用域
在Spring中,bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。
目前Spring Bean的作用域或者说范围主要有五种。
作用域 | 描述 |
---|---|
singleton | 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。 |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。 |
session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。 |
application | 限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。 |
websocket | 在一个 HTTP WebSocket 的生命周期中,定义一个 Bean 实例。 |
1.单例作用域(singleton)和 全局作用域(application)对比:
-
singleton 是 Spring Core 的作用域;application 是 Spring Web 中的作用域;
-
singleton 作用于 IoC 的容器,而 application 作用于 Servlet 容器。
2.Spring中的Bean是线程安全的吗?
首先Bean的线程安全问题只会在singleton和application出现,不会出现在prototype和request中
然后Bean分为有状态的Bean(既查询又修改)和无状态的Bean(只有查询没有修改)
3.如何避免Bean线程安全
- 作用域设置为prototype和request
- 避免在Bean中定义需要修改的成员变量
- 使用ThreadLoacl保存Bean的成员变量