Spring中的Scope
前言
在Spring框架中,Bean的作用域(Scope)定义了Bean的实例化和生命周期管理的策略。通过@Scope
注解,我们可以明确指定Bean的作用域,以适应不同的应用场景。Spring提供了多种作用域,以满足不同层级的需求。
类型及示例
-
singleton
单例模式:这是Spring的默认作用域。当Spring容器启动时,对于标记为
singleton
的Bean,Spring会创建该Bean的单个实例,并将其存储在容器中。整个容器中只有一个这样的Bean实例,供所有组件共享。如果希望延迟Bean的初始化(即懒加载),可以结合使用@Lazy
注解。示例代码:
@Configuration public class AppConfig { @Bean @Lazy // 懒加载,当首次被使用时才创建Bean实例 public MyBean myBean() { return new MyBean(); } }
-
prototype
原型模式:每次通过
getBean
方法请求该作用域的Bean时,Spring都会创建一个新的Bean实例。这些实例由Spring容器创建,但容器不会跟踪它们的管理和销毁,这些任务交由Java的垃圾回收机制来处理。应用场景:适用于需要频繁创建且生命周期较短的Bean,如用户会话数据对象。
-
request
(Web项目特有)请求作用域:每次HTTP请求时,Spring都会为该请求创建一个新的Bean实例,并在请求完成后销毁它。这种作用域主要用于与Web请求绑定的Bean,如请求处理器或数据绑定对象。
应用场景:适用于需要在每次请求中保持独立状态的Bean,如请求参数解析器。
-
session
(Web项目特有)会话作用域:为每个HTTP会话创建一个Bean实例,并在会话结束时销毁它。这种作用域非常适合存储与特定用户会话相关的数据。
应用场景:用于存储用户会话信息,如用户偏好设置或购物车数据。
-
application
(全局Web域,注意原描述中的global session
可能是个误称)应用作用域:在整个Web应用中,只创建一个Bean实例,并在ServletContext的生命周期内存在。这种作用域类似于Servlet中的
ServletContext
,适用于需要跨多个用户会话共享数据的场景。应用场景:适用于存储全局配置信息或跨会话共享的数据,如全局计数器或系统配置参数。
注意
-
在Web项目中,
request
、session
和application
作用域通常与Spring MVC或Spring WebFlux集成使用,以支持Web应用中的不同请求和会话管理需求。 -
默认情况下,Spring的Bean是
singleton
作用域的。如果需要使用其他作用域,必须明确指定。 -
prototype
作用域的Bean不是由Spring容器直接销毁的,它们的生命周期由垃圾回收机制控制。因此,如果Bean持有了需要显式关闭的资源(如数据库连接或文件句柄),开发者需要确保在Bean不再需要时正确关闭这些资源。