Bean的作用域

Spring IoC容器中单例与原型模式详解
知识点:


.singleton
在每个Spring IoC容器中一个bean定义只有一个对象实例。默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如:
<bean id="xxx" class="cn.itcast.OrderServiceBean" lazy-init="true"/>
如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:
<beans default-lazy-init="true“ ...>
.prototype
每次从容器获取bean都是新的对象。

下面的对象是在java web 中才能使用的作用域
.request
.session
.global session



默认情况下bean实例的作用域是singleton 单例每次调用getBean得到同一个对象,
这里可以使用scope="prototype"知道这个bean是原型模式每次得到不同的对象
<think> 我们正在讨论Bean作用域。根据用户要求和提供的引用,需要详细介绍Spring Bean的六种作用域。 引用[1]和[2]提到Bean的六种作用域:singleton, prototype, request, session, application, websocket。 引用[3]详细解释了request作用域。 引用[4]详细解释了单例作用域(singleton)以及懒加载。 引用[5]给出了application作用域的代码示例。 因此,我们依次介绍六种作用域,并注意以下几点: 1. 作用域的定义。 2. 适用场景。 3. 配置方式(如果引用中有提到)。 4. 注意事项(如作用域生效的条件,比如request作用域只在web环境下生效)。 同时,根据用户要求,我们需要生成相关问题。 注意:回答中需要引用的时候,在末尾自然地加上引用标识,例如:[^1] </think> ### Spring Bean作用域详解 Spring Bean作用域定义了Bean在应用程序中的生命周期和可见范围。合理选择作用域能够优化资源利用、提升性能。Spring提供了六种标准作用域,分为基础作用域(singleton/prototype)和Web作用域(request/session/application/websocket)[^1][^2]。 #### 1. **单例作用域(Singleton)** - **特性**:Spring默认作用域,整个IoC容器中只有一个Bean实例。 - **生命周期**: - 容器启动时立即创建(默认) - 可通过`lazy-init="true"`设为懒加载,首次使用时创建[^4] - **适用场景**:无状态的工具类Bean(如配置类、工具类) - **配置方式**: ```xml <bean id="user" class="com.example.User" scope="singleton"/> ``` ```java @Bean @Scope("singleton") public User user() { return new User(); } ``` #### 2. **原型作用域(Prototype)** - **特性**:每次请求都创建新实例,不缓存对象。 - **生命周期**: - 容器启动时不创建 - 每次调用`getBean()`生成新对象 - **适用场景**:需要保持独立状态的Bean(如购物车、用户会话) - **配置方式**: ```xml <bean id="cart" class="com.example.Cart" scope="prototype"/> ``` #### 3. **Web相关作用域** | 作用域 | 生命周期 | 典型场景 | 生效条件 | |--------------|-----------------------------------|------------------------------|--------------------------| | **Request** | 一次HTTP请求内有效 | 表单数据封装、请求级缓存 | 需Web环境(Spring MVC)[^3] | | **Session** | 用户会话期间有效 | 用户登录状态、个性化设置 | 需Web环境 | | **Application**| 整个Web应用生命周期有效 | 全局计数器、共享资源配置 | 需Web环境[^5] | | **WebSocket**| WebSocket会话期间有效 | 实时聊天、消息推送 | 需WebSocket支持 | **配置示例(注解方式)**: ```java @Bean @RequestScope // 或 @SessionScope, @ApplicationScope public AnalyticsService analytics() { return new AnalyticsService(); } ``` #### 4. **核心区别总结** | 特性 | Singleton | Prototype | Web作用域 | |---------------|----------------|----------------|------------------------| | **实例数量** | 1个/容器 | N个/每次请求 | 依赖HTTP上下文 | | **创建时机** | 启动或懒加载 | 每次请求时 | 请求/会话/应用启动时 | | **资源共享** | 全局共享 | 完全独立 | 作用域内共享 | | **内存占用** | 低 | 高 | 中等 | #### 5. **最佳实践建议** 1. **优先使用单例**:默认选择singleton,减少资源消耗[^4]。 2. **避免跨作用域注入**:如singleton注入prototype会导致状态异常。 3. **Web作用域需显式配置**: ```java // 启用Web作用域代理 @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) ``` 4. **线程安全**:singleton需设计为无状态或线程安全。 > 关键提醒:作用域直接影响Bean的创建销毁逻辑,错误使用可能导致内存泄漏(如prototype未及时回收)或状态污染(如singleton存储用户数据)[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青年IT男

您的打赏就是对我的肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值