温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

依赖作用域怎么用

发布时间:2026-07-25 00:39:57 来源:亿速云 阅读:87 作者:小樊 栏目:编程语言

“依赖作用域”(Dependency Scope)通常指 依赖注入(Dependency Injection, DI)或 IoC 容器中,控制依赖对象“存活范围 / 可见范围”的规则。不同框架叫法略有差异,但核心思想一致:一个对象被创建后,在多长时间/范围内复用,什么时候销毁

下面按 通用概念 → 常见作用域类型 → 主流框架示例(Spring / Angular / Compose) 来讲解。


一、依赖作用域是干什么的?

作用域解决的是三个问题:

  1. 什么时候创建依赖对象
  2. 什么时候复用同一个对象
  3. 什么时候销毁

例如:

  • 一个 UserService
    • 如果是 单例:整个应用共用一个
    • 如果是 请求级:每个 HTTP 请求创建一个
    • 如果是 临时:每次用都新建

二、常见的作用域类型(通用)

作用域 含义
Singleton(单例) 全局唯一,容器启动时创建
Prototype(原型) 每次注入/获取都新建
Request(请求) 每个 HTTP 请求创建一个
Session 每个用户会话一个
Scoped 在某一“作用域”内唯一
Transient 即用即创建(最短命)

三、Spring 中的依赖作用域(最典型)

1️⃣ 常见作用域

@Component
@Scope("singleton")   // 默认
public class UserService {}
作用域 说明
singleton(默认) 整个 Spring 容器一个实例
prototype 每次 getBean() 或注入都新建
request 每个 HTTP 请求
session 每个 HttpSession
application ServletContext 级别

2️⃣ 示例

✅ Singleton(默认)

@Bean
public UserService userService() {
    return new UserService();
}

整个应用只有一个 UserService

✅ Prototype

@Bean
@Scope("prototype")
public UserService userService() {
    return new UserService();
}
@Autowired
private UserService a;

@Autowired
private UserService b;
// a ≠ b

✅ Request 作用域

@Bean
@RequestScope
public UserSession userSession() {
    return new UserSession();
}

每个请求一个 UserSession


3️⃣ 注入作用域不一致的坑 ⚠️

@Singleton
class A {
    @Autowired
    private PrototypeService p; // ❌ 只会注入一次
}

✅ 正确方式:使用 ObjectProviderProvider

@Autowired
private ObjectProvider<PrototypeService> provider;

public void test() {
    PrototypeService p = provider.getObject();
}

四、前端:Angular 的依赖作用域

Angular 中的作用域其实是“模块 / 组件层级”

@Injectable({
  providedIn: 'root' // 单例
})
export class UserService {}
场景 作用
providedIn: 'root' 全局单例
providers 中声明 该组件及其子组件共享
每个组件实例 每次新建组件新建一个
@Component({
  providers: [UserService]
})
class UserComponent {}

五、Jetpack Compose(Android)中的作用域

Compose 中的“作用域”不是 DI,而是 组合作用域

CompositionLocalProvider(LocalUser provides user) {
    // 子组件可获取 user
}

作用域 = 可组合函数的嵌套范围


六、什么时候该用什么作用域?

经验法则 ✅

  • 无状态 Beansingleton
  • 有状态、线程不安全prototype / request
  • 用户相关数据session / request
  • 大数据对象、缓存 → 小心 singleton

七、一句话总结

依赖作用域 = 决定“依赖对象在什么时候、在哪里、被谁复用”的规则

如果你在具体用某个框架(比如 Spring Boot / Angular / NestJS / Compose),告诉我,我可以直接给你“对应框架 + 场景 + 示例代码”

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI