【问题标题】:Does Dagger2 Initialize Objects it does not use?Dagger2 是否初始化它不使用的对象?
【发布时间】:2017-11-21 19:49:34
【问题描述】:

我有一个@Module 类,它有许多@Provides 方法。我的 @Component 依赖于这个 Module 类。例如:

@Singleton
@Component(modules = { MyModule.class})
public interface MyComponent {

    ObjectA getObjectA();

    ObjectB getObjectB();

}

@Module
public class MyModule {

    @Provides
    @Singleton
    ObjectC provideObjectC() {
        return new ObjectC();   
    }

    @Provides
    @Singleton
    ObjectD provideObjectD() {
        return new ObjectD();   
    }

    @Provides
    @Singleton
    ObjectA provideObjectA(ObjectC objectC) {
        return new ObjectA(objectC);    
    }

    @Provides
    @Singleton
    ObjectB provideObjectB(ObjectD objectD) {
        return new ObjectB(objectD);    
    }
}

我使用 Dagger 构建器创建了一个组件实例,并提供了一个新的 MyModule 实例。如果我只调用 myComponent.getObjectA() 它还会构造 ObjectB(及其依赖项),还是那些未构造的?

【问题讨论】:

    标签: dagger-2


    【解决方案1】:

    对我在问题中提供的带有日志记录的代码进行了手动测试。如果你的注入只使用 ObjetA,它会创建 ObjectA 和 ObjectC,但不会创建 ObjectB 或 ObjectD。

    【讨论】:

    • 您知道,您提供的代码并没有真正遵循使用 Dagger 的标准做法。您不应该手动调用提供程序方法。
    • 我已经更新了问题以反映这一点并避免将来出现混淆,因为问题实际上不是关于对象的注入,而是关于完全未使用的对象。
    【解决方案2】:

    我使用 Dagger 已经有一段时间了,但您应该在提供语句中将它们指定为参数,以使其正常工作。它将管理调用您的其他提供程序方法来获取单例实例。

    @Provides
    @Singleton
    ObjectB provideObjectB(ObjectD objectD) {
        return new ObjectB(objectD);   
    }
    

    或者你也可以将它指定为注入的构造函数。见Dagger 2 injecting parameters of constructor

    【讨论】:

    • 谢谢,但这并不能完全回答我在问题中寻找的内容。即使使用这种模式,它是否会构造不会在 Component 接口上调用的对象?
    • 是的,对不起,我应该更清楚。它将在内部处理调用您的其他提供程序函数。
    猜你喜欢
    • 2013-06-27
    • 2010-12-06
    • 1970-01-01
    • 2023-03-25
    • 2018-05-07
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多