@scope注解用于指定bean的预定义作用域而非自定义生命周期,常用值包括singleton(默认,单例)、prototype(每次创建新实例)、request、session和application(仅web环境),配合@postconstruct/@predestroy可实现初始化与销毁逻辑,但prototype下@predestroy不自动触发。

在 Spring 中,@Scope 注解用于控制 Bean 的创建时机和存活周期,它不直接“自定义”生命周期范围,而是从预定义的几种作用域中选择一种。真正实现自定义生命周期行为(比如初始化后执行、销毁前清理)需配合 @PostConstruct、@PreDestroy 或实现 InitializingBean/DisposableBean 接口。
常用内置作用域及用法
@Scope 支持以下标准值(Spring 5+ 默认为 singleton):
-
@Scope("singleton"):整个 Spring 容器中仅一个实例,首次请求时创建,容器关闭时销毁(默认) -
@Scope("prototype"):每次getBean()或依赖注入时都新建实例,Spring 不管理其销毁(需手动处理资源) -
@Scope("request"):每个 HTTP 请求创建一个实例,请求结束即销毁(仅 Web 环境有效) -
@Scope("session"):每个 HTTP Session 创建一个实例,Session 失效时销毁(Web 环境) -
@Scope("application"):每个 ServletContext 生命周期内一个实例(Web 环境)
使用 @Scope 声明 Bean 作用域
可放在 @Component 类上,或 @Bean 方法上:
@Component
@Scope("prototype")
public class UserService { }
或:
@Configuration
public class AppConfig {
@Bean
@Scope("request")
public UserContext userContext() {
return new UserContext();
}
}
注意 Web 作用域需额外配置
若使用 request、session 等 Web 作用域,必须启用对应代理支持:
- XML 配置:
<annotation-config></annotation-config>+<bean class="org.springframework.web.context.request.RequestContextListener"></bean> - Java 配置:确保
WebApplicationContext已加载,并注册RequestContextFilter(Servlet 3.0+ 推荐) - 否则会抛出
IllegalStateException: No Scope registered for scope name 'request'
配合生命周期回调实现自定义行为
@Scope 决定“何时创建/是否复用”,而“创建后做什么”“销毁前做什么”由生命周期回调控制:
@Component
@Scope("prototype")
public class TemporaryService {
@PostConstruct
public void init() {
System.out.println("实例已创建,执行初始化");
}
@PreDestroy
public void cleanup() {
System.out.println("即将被 GC,执行清理(注意:prototype 下 @PreDestroy 不自动触发!)");
}
}
关键提醒:对于 prototype Bean,@PreDestroy 不会被 Spring 自动调用(因为 Spring 不跟踪其销毁)。如需清理,应显式调用或使用 ObjectFactory/Provider 获取并管理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











