Bean的作用域详解(6种常见作用域)

Bean的作用域详解(6种常见作用域)-mikechen

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面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法