gpt4 book ai didi

java - JSR-330 中的 Inject 和 Provider 有什么区别

转载 作者:行者123 更新时间:2023-11-30 06:08:08 24 4
gpt4 key购买 nike

全部

我不知道 JSR-330 中的 Inject 和 Provider 有什么区别。我正在使用 google guice,并且每天都使用 @Inject ,我知道在 JSR-330 中,它有 Provider<T> .

我的问题是

  1. Provider<T> 是什么意思? ?
  2. 用户什么时候可以Provider<T>
  3. @Inject 有何区别? ?

提前致谢。

最佳答案

所有内容都已在 javadoc 中进行了解释,我引用:

Compared to injecting T directly (implicitly using @Inject only), injecting Provider<T> enables:

  1. retrieving multiple instances.
  2. lazy or optional retrieval of an instance.
  3. breaking circular dependencies.
  4. abstracting scope so you can look up an instance in a smaller scope from an instance in a containing scope.

#1 的示例:

这里你得到了几个 Seat 的实例来自同一供应商,因此它被用作工厂。

class Car {
@Inject
Car(Provider<Seat> seatProvider) {
Seat driver = seatProvider.get();
Seat passenger = seatProvider.get();
...
}
}

#2 的示例:

在这里您使用提供者来避免直接创建类 MyClassLongToCreate 的实例因为我们知道这是一个缓慢的操作,所以我们会懒惰地得到它感谢 get仅在需要时使用方法。

class MyClass {
@Inject
private Provider<MyClassLongToCreate> lazy;
...
}

#3 的示例:

这是一个容器无法轻易解决的循环依赖,因此某些容器可能会抛出异常,因为它们不知道如何自行解决。

class C1 {
private final C2 c2;
@Inject
C1(C2 c2) {
this.c2 = c2;
...
}
}

class C2 {
private final C1 c1;
@Inject
C2(C1 c1) {
this.c1 = c1;
...
}
}

为了修复它,我们使用 Provider在至少一个构造函数上打破循环依赖,如下所示:

class C1 {
private final Provider<C2> c2;
@Inject
C1(Provider<C2> c2) {
this.c2 = c2;
...
}
}

这将允许容器完全创建 C1 的实例首先(因为我们实际上不需要创建 C2 的实例来注入(inject) C2 的提供者)一旦完成,容器将能够创建 C2 的实例来自 C1 的这个实例.

#4 的示例:

这里有一个类 C2范围为取决于 C1 的 session itslef 作用域为请求,我们使用提供者来允许我们获取 C1 的实例对应于当前请求,因为它将从一个请求更改为另一个请求。

@RequestScoped
public class C1 {
...
}

@SessionScoped
public class C2 {
@Inject
private Provider<C1> provider;
...
public void doSomething() {
// Get the instance corresponding to the current request
C1 c1 = provider.get();
...
}
}

关于java - JSR-330 中的 Inject 和 Provider 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40384780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com