gpt4 book ai didi

dependency-injection - Dagger 2.0 构造函数注入(inject)和单例

转载 作者:行者123 更新时间:2023-12-04 08:21:53 24 4
gpt4 key购买 nike

是否可以一次使用 Dagger 2.0 构造函数注入(inject)和单例。
我在文档中找不到答案。

例子:

@Singleton
public class MyClass {
private final OtherClass member;

@Inject
public MyClass(OtherClass member){
this.member = member;
}
}

构造函数注入(inject)确实有效。但是,如果我在类(class)上写@Singleton,是否可以保证 MyClass 被创建为单例?

谢谢

最佳答案

是的。

由于 Dagger 2 为您生成源代码,因此很容易检查正在发生的事情。例如,当将以下模块与您的 MyClass 结合使用时:

@Component
@Singleton
public interface MyComponent {
MyClass myClass();
}

生成以下实现:

@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerMyComponent implements MyComponent {
private Provider<MyClass> myClassProvider;

private DaggerMyComponent(Builder builder) {
assert builder != null;
initialize(builder);
}

public static Builder builder() {
return new Builder();
}

public static MyComponent create() {
return builder().build();
}

private void initialize(final Builder builder) {
this.myClassProvider = ScopedProvider.create(MyClass_Factory.create(OtherClass_Factory.create()));
}

@Override
public MyClass myClass() {
return myClassProvider.get();
}

public static final class Builder {
private Builder() {
}

public MyComponent build() {
return new DaggerMyComponent(this);
}
}
}

initialize(Builder) , 你可以看到一个 ScopedProvider用作 Provider对于 MyClass .调用 myClass() 时方法, ScopedProviderget()方法被调用,它被实现为一个单例:

public T get() {
// double-check idiom from EJ2: Item 71
Object result = instance;
if (result == UNINITIALIZED) {
synchronized (this) {
result = instance;
if (result == UNINITIALIZED) {
instance = result = factory.get();
}
}
}
return (T) result;
}

关于dependency-injection - Dagger 2.0 构造函数注入(inject)和单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356287/

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