1. Spring Bean作用域基础解析
第一次接触Spring框架时,我对Bean作用域这个概念特别困惑。记得当时写了个购物车功能,所有用户的购物车竟然都混在一起,后来才发现是作用域配置出了问题。Spring中的Bean作用域决定了Bean实例的生命周期和可见范围,这是每个Spring开发者必须掌握的核心概念。
Spring框架提供了五种标准作用域,其中最常用的是singleton和prototype:
- singleton:默认作用域,整个IOC容器中只存在一个实例
- prototype:每次请求都创建新实例
- request:每个HTTP请求创建一个实例
- session:每个HTTP会话创建一个实例
- application:每个ServletContext生命周期内一个实例
理解这些作用域的区别,就像理解餐厅的不同座位安排。单例模式就像餐厅里的共享大桌,所有顾客都坐在一起;原型模式则是给每位顾客单独的小桌;请求作用域相当于临时加座,请求结束就撤掉;会话作用域则是VIP包间,会话期间专属使用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. @Scope注解深度剖析
在实际项目中,我习惯用@Scope注解来精确控制Bean的作用域。这个注解的用法看似简单,但有很多值得注意的细节。最基本的用法是直接在Bean定义上标注:
java复制@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
public ShoppingCart shoppingCart() {
return new ShoppingCart();
}
}
@Scope注解有几个重要的配置项:
- value:指定作用域名称(如"singleton"、"prototype")
- proxyMode:指定代理模式(ScopedProxyMode.INTERFACES或ScopedProxyMode.TARGET_CLASS)
代理模式特别重要,尤其是在Web环境中注入短生命周期Bean到长生命周期Bean时。比如在单例Service中注入请求作用域的Bean,就需要配置代理:
jav复制
