Spring中Bean的作用域主要有singleton、prototype、request、session、application和websocket。singleton是默认作用域,容器中仅存在一个共享实例,适用于无状态的Service或DAO组件,能提升性能但需注意线程安全;prototype每次请求都会创建新实例,适合有状态或非线程安全的对象,但需自行管理资源释放;request作用域为每个HTTP请求创建独立Bean实例,用于处理请求级数据;session作用域确保每个用户会话拥有一个Bean实例,常用于购物车或登录状态;application作用域在整个Web应用生命周期内创建唯一实例,供所有用户共享,适合全局配置;websocket作用域用于WebSocket会话中维护状态。Spring默认使用singleton,因其高效复用、减少开销,符合无状态服务设计原则,体现“约定优于配置”理念。prototype适用于有状态、非线程安全或短生命周期对象,但带来性能损耗和资源管理负担。在Web应用中,request、session、application的区别在于生命周期和可见范围:request对应单次请求,session对应用户会话,application对应整个应用上下文,选择应基于数据的共享需求和生命周期。

Spring中Bean的作用域(Scope)主要有几种:
singleton
prototype
request
session
application
我们来逐一看看这些作用域的含义和它们在不同场景下的应用。
Singleton (单例) 这是Spring容器默认的作用域。这意味着对于容器中的一个Bean定义,Spring只会创建一个唯一的实例。所有对该Bean的引用都将指向这个相同的实例。这很适合无状态的服务层Bean,比如Service、DAO等,因为它们通常不持有特定的用户数据,可以被多个请求共享。我个人觉得,这也是Spring设计哲学的一个体现,即通过复用对象来节省资源,提高性能。但话说回来,如果你的Bean有状态,且这个状态是多线程共享的,那就要特别小心线程安全问题了。
Prototype (原型) 与单例相反,每次从容器中请求
prototype
prototype
Request (请求) 这个作用域只在Web应用中有效。它意味着对于每个HTTP请求,Spring容器会创建一个新的Bean实例。请求结束时,该Bean实例也会被销毁。这对于那些需要在单个HTTP请求生命周期内维护状态的Bean非常有用,比如一个存储当前请求用户信息的Bean。想象一下,一个用户登录后,其请求上下文信息就可以通过
request
Session (会话) 同样是Web应用专属,
session
Application (应用) 这个作用域的Bean在整个Web应用生命周期内只创建一个实例,并且这个实例在所有Servlet Context中都是可见的。它类似于Web应用中的单例,但作用范围更广,通常用于存储一些全局的配置信息、统计数据或者共享资源。例如,一个全局的计数器,或者一个加载了应用启动时所需资源的Bean,就可以设置为
application
WebSocket (WebSocket) 虽然不是最常见的,但在Spring 4.0及更高版本中,如果你开发WebSocket应用,还可以使用
websocket
Spring将
singleton
其次,无状态服务的设计理念。在企业级应用中,很多组件,比如Service层、DAO层,它们的核心职责是执行业务逻辑或数据操作,本身并不需要持有特定的用户状态。它们可以被多个客户端或线程安全地共享。将这些组件设计为单例,完美契合了这种无状态服务的设计模式,避免了不必要的对象膨胀。
再者,简化管理和配置。作为默认值,单例减少了开发者在配置Bean时的心智负担。大多数情况下,我们确实需要单例行为,如果每次都要显式指定,反而会增加代码的冗余。Spring的这种默认选择,无疑是基于“约定优于配置”原则的一个体现。
当然,这并非没有代价。单例Bean必须是线程安全的,或者至少是无状态的。如果一个单例Bean内部维护了可变状态,并且这个状态会被多个线程同时访问和修改,那么就非常容易出现并发问题,这在实际开发中是需要特别注意的。我记得有一次,我们团队的一个单例缓存服务因为没有正确处理并发写入,导致数据不一致,排查了很久才定位到问题。所以,虽然单例是默认且高效的,但绝不能忽视其潜在的线程安全风险。
使用
prototype
prototype
Order
WorkflowContext
prototype
prototype
prototype
然而,使用
prototype
prototype
destroy
prototype
prototype
prototype
在Web应用环境中,
request
session
application
Request 作用域:一次HTTP请求的生命周期
request
RequestScopedUserContext
Session 作用域:一个用户会话的生命周期
session
ShoppingCart
session
Application 作用域:整个Web应用的生命周期
application
GlobalConfig
AccessCounter
ServletContext
关键区别总结: | 特性 | Request Scope | Session Scope | Application Scope | | :--- | :--- | :--- | :--- | | 生命周期 | 单个HTTP请求 | 单个HTTP会话 | 整个Web应用 | | 可见性 | 仅当前请求可见 | 仅当前会话可见 | 所有请求、所有会话可见 | | 实例数量 | 每个请求一个 | 每个会话一个 | 整个应用一个 | | 用途 | 临时请求数据 | 用户会话数据 | 全局配置、共享资源 |
选择哪种作用域,完全取决于Bean所承载的数据的生命周期和共享需求。如果数据只在一次请求中有效,用
request
session
application
request
session
application
以上就是Spring中Bean的作用域(Scope)有哪些?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号