Spring框架提供了多种不同的 bean作用域,下面详解6种常见Bean的作用域@mikechen
singleton(单例)
这是默认的作用域,在该作用域下,Spring 容器只会创建一个 bean 实例,并在容器的整个生命周期内重用这个实例。
如下所示:
<bean id="singletonBean" class="com.example.SingletonBean" scope="singleton" />
无论多少次请求该 bean,都会得到同一个实例。
适用场景
适用于状态无关、共享的 bean,比如:数据库连接、配置对象等。
prototype(原型)
在该作用域下,每次从 Spring 容器获取 bean 时都会创建一个新的实例。
如下所示:
<bean id="prototypeBean" class="com.example.PrototypeBean" scope="prototype" />
因此,无论多少次请求该 bean,都会得到不同的实例。
适用场景
适用于每次获取时需要一个新的、独立的实例的情况。
注意事项:
- 由于 Prototype 作用域的 bean 不受容器管理的生命周期影响,你需要自行负责销毁这些 bean。
request(请求)
Spring 的 Request 作用域是在 Web 应用中使用的一种特殊的作用域,它与每个 HTTP 请求的生命周期相对应。
在一个 HTTP 请求的生命周期内,每个 bean 都会创建一个实例,并且在请求结束后销毁。
如下所示:
@Controller @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) public class RequestScopedController { // ... }
适用场景
- Request 作用域适用于需要在每个请求中保持独立状态的情况,如:存储用户请求相关的数据、表单数据等。
- 通常在 Web 控制器、过滤器等组件中使用。
session(会话)
在 Web 应用中有效,在用户会话的生命周期内,每个 bean 都会创建一个实例,并且在会话结束后销毁。
如下所示:
@Controller @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class SessionScopedController { // ... }
适用场景:
- 适用于需要在整个会话期间保持独立状态的情况,比如:购物车、用户会话信息等。
- 适用于需要跨多个请求保持会话状态的情况。
application(应用)
在整个 Web 应用的生命周期内,每个 bean 都会创建一个实例。
如下所示:
@Controller @Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class ApplicationScopedController { // ... }
适用场景:
适用于需要在整个应用中共享的 bean,比如:全局配置、共享数据等。
websocket(WebSocket)
在每个 WebSocket 连接的生命周期内,每个 bean 都会创建一个实例。
如下所示:
@Controller @Scope(value = WebApplicationContext.SCOPE_WEBSOCKET, proxyMode = ScopedProxyMode.TARGET_CLASS) public class WebSocketScopedController { // ... }
适用于需要在每个 WebSocket 连接中保持状态的情况,如实时通信应用。
以上就是常见的6种Bean的作用域详解,更多Spring内容请查看:Spring教程(史上最全图文详解)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》