代码之家  ›  专栏  ›  技术社区  ›  emilyk

Dagger2是否初始化它不使用的对象?

  •  2
  • emilyk  · 技术社区  · 7 年前

    我有一个@Module类,它有许多@Provides方法。我的@组件依赖于这个模块类。前任:

    @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 builder创建了该组件的一个实例,并提供了MyModule的一个新实例。如果我只调用myComponent。getObjectA()它还会构造ObjectB(及其依赖项),还是那些未构造的?

    2 回复  |  直到 7 年前
        1
  •  4
  •   emilyk    7 年前

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

        2
  •  0
  •   Austin Hanson    7 年前

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

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

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

    推荐文章