@scope 注解用于声明 spring bean 的作用域,默认 singleton,还可设为 prototype、request、session、application 等;需注意 prototype 依赖不自动刷新,web 作用域需 requestcontextfilter 和代理配置。

@Scope 是 Spring 中用于声明 Bean 作用域的注解,它决定 Spring 容器如何创建和管理该 Bean 的实例生命周期。默认是单例(singleton),但你可以根据业务需要切换为原型(prototype)、请求(request)、会话(session)等作用域。
常见作用域类型及适用场景
Spring 提供了多种内置作用域,最常用的是:
- singleton:默认值,整个 Spring 容器中只存在一个实例,线程不安全需自行处理;适合无状态工具类、服务类。
- prototype:每次获取 Bean 时都新建一个实例;适合有状态的对象,比如封装用户提交数据的 DTO 或临时计算对象。
- request:每个 HTTP 请求创建一个实例,请求结束即销毁;常用于 Web 层与请求强绑定的对象(如表单处理器)。
- session:每个 HTTP 会话对应一个实例;适合存储用户登录态、购物车等会话级数据。
- application:整个 ServletContext 生命周期内共享一个实例;类似 singleton,但作用范围更广(跨多个 Spring 容器时可能不同)。
在类上直接使用 @Scope
最简单的用法是在 Bean 类上添加 @Scope 注解:
@Component
@Scope("prototype")
public class UserContextHolder {
private String userId;
// getter/setter...
}
也可以用枚举形式写得更清晰:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UserContextHolder { ... }
注意:如果 Bean 是 prototype 作用域,依赖它的其他 singleton Bean 不会自动重新获取新实例——因为注入发生在容器启动时,后续调用不会刷新依赖。需要配合 @Lookup 方法或 ObjectFactory 手动获取。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Web 环境下启用 request/session 作用域
request 和 session 作用域仅在 Web 应用中有效,且需额外配置:
- 确保项目引入了
spring-web依赖。 - 在传统 Servlet 容器(如 Tomcat)中,需注册
RequestContextFilter或RequestContextListener,让 Spring 能感知 HTTP 上下文。 - Spring Boot 默认已自动配置,无需手动添加 Filter。
示例:
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestContextBean {
private final String requestId = UUID.randomUUID().toString();
}
proxyMode = TARGET_CLASS 很关键:它让 Spring 生成 CGLIB 代理,确保 singleton Bean(如 Controller)注入的是“代理对象”,每次调用都能拿到当前请求对应的实例。
自定义作用域(进阶)
除了内置作用域,你还可以实现 org.springframework.beans.factory.config.Scope 接口,注册自定义作用域,例如按租户隔离、按线程上下文隔离等。注册方式:
- 实现
Scope接口并重写get、remove等方法; - 通过
ConfigurableBeanFactory.registerScope()注册; - 再在 Bean 上用
@Scope("yourCustomScope")引用。
实际项目中较少需要,但对多租户 SaaS 架构或复杂上下文管理很有价值。










