@Scope注解用于指定Bean作用域,默认singleton(单例),prototype每次获取新建实例;还支持request、session等Web作用域;prototype Bean需手动管理销毁,单例Bean需注意线程安全。

在 Spring 中,@Scope 注解用于指定 Bean 的作用域,最常用的是控制 Bean 是单例(singleton)还是多例(prototype)。默认情况下,Spring 容器中的 Bean 都是单例的,即整个应用上下文中只存在一个实例;而通过 @Scope 显式声明为 prototype,每次获取该 Bean 时都会创建新实例。
理解 @Scope 的常见取值
@Scope 支持多个作用域类型,实际开发中主要用到以下几种:
-
singleton:默认值。容器启动时创建一次,后续所有依赖注入或
getBean()调用都返回同一个实例。 - prototype:每次请求(注入或获取)都会新建一个实例,Spring 不管理其生命周期(销毁方法不会自动调用)。
-
request:Web 环境下,每个 HTTP 请求对应一个 Bean 实例(需配合
RequestScope配置)。 - session:每个用户会话对应一个 Bean 实例(同样需 Web 环境支持)。
在类上使用 @Scope 控制单例或多例
直接在组件类(如 @Component、@Service、@Repository)上添加 @Scope 即可:
@Service
@Scope("prototype") // 或 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UserService {
private final String id = UUID.randomUUID().toString();
public String getId() {
return id;
}
}
这样每次注入或通过 ApplicationContext.getBean(UserService.class) 获取时,都会得到不同实例,getId() 返回的 UUID 也不相同。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
注意 prototype Bean 的生命周期管理
Spring 不负责 prototype Bean 的销毁,因此:
- 其
@PreDestroy方法不会被自动调用; - 如果 Bean 持有外部资源(如文件句柄、网络连接),需手动释放;
- 若需在 prototype Bean 中执行清理逻辑,建议提供显式
close()或destroy()方法,并由调用方负责调用。
在配置类中定义 Bean 时指定作用域
使用 @Bean 方法时,可通过 scope 属性设置:
@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
public EmailService emailService() {
return new EmailService();
}
}
这种方式更灵活,尤其适合需要参数化构造或复杂初始化逻辑的 Bean。
不复杂但容易忽略:单例 Bean 中若持有可变状态(比如缓存 Map、计数器),可能引发线程安全问题;而 prototype Bean 虽然隔离了状态,但频繁创建会带来开销,应按需选择。

















