“依赖作用域”(Dependency Scope)通常指 依赖注入(Dependency Injection, DI)或 IoC 容器中,控制依赖对象“存活范围 / 可见范围”的规则。不同框架叫法略有差异,但核心思想一致:一个对象被创建后,在多长时间/范围内复用,什么时候销毁。
下面按 通用概念 → 常见作用域类型 → 主流框架示例(Spring / Angular / Compose) 来讲解。
作用域解决的是三个问题:
例如:
UserService
| 作用域 | 含义 |
|---|---|
| Singleton(单例) | 全局唯一,容器启动时创建 |
| Prototype(原型) | 每次注入/获取都新建 |
| Request(请求) | 每个 HTTP 请求创建一个 |
| Session | 每个用户会话一个 |
| Scoped | 在某一“作用域”内唯一 |
| Transient | 即用即创建(最短命) |
@Component
@Scope("singleton") // 默认
public class UserService {}
| 作用域 | 说明 |
|---|---|
singleton(默认) |
整个 Spring 容器一个实例 |
prototype |
每次 getBean() 或注入都新建 |
request |
每个 HTTP 请求 |
session |
每个 HttpSession |
application |
ServletContext 级别 |
@Bean
public UserService userService() {
return new UserService();
}
整个应用只有一个
UserService
@Bean
@Scope("prototype")
public UserService userService() {
return new UserService();
}
@Autowired
private UserService a;
@Autowired
private UserService b;
// a ≠ b
@Bean
@RequestScope
public UserSession userSession() {
return new UserSession();
}
每个请求一个
UserSession
@Singleton
class A {
@Autowired
private PrototypeService p; // ❌ 只会注入一次
}
✅ 正确方式:使用 ObjectProvider 或 Provider
@Autowired
private ObjectProvider<PrototypeService> provider;
public void test() {
PrototypeService p = provider.getObject();
}
@Injectable({
providedIn: 'root' // 单例
})
export class UserService {}
| 场景 | 作用 |
|---|---|
providedIn: 'root' |
全局单例 |
在 providers 中声明 |
该组件及其子组件共享 |
| 每个组件实例 | 每次新建组件新建一个 |
@Component({
providers: [UserService]
})
class UserComponent {}
Compose 中的“作用域”不是 DI,而是 组合作用域
CompositionLocalProvider(LocalUser provides user) {
// 子组件可获取 user
}
作用域 = 可组合函数的嵌套范围
singletonprototype / requestsession / request依赖作用域 = 决定“依赖对象在什么时候、在哪里、被谁复用”的规则
如果你在具体用某个框架(比如 Spring Boot / Angular / NestJS / Compose),告诉我,我可以直接给你“对应框架 + 场景 + 示例代码”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。