首页 > 解决方案 > Dagger组件体

问题描述

我对 Dagger 很陌生,发现组件体有点难以理解,有 2 个与组件实现相关的具体问题:

1)

  @Singleton
    @Component(modules = { UserModule.class, BackEndServiceModule.class })
    public interface MyComponent {

        BackendService provideBackendService();// Line 1

        void inject(Main main); // Line 2
    }

2号线的目的是什么?即使删除了第 1 行,也会创建一个 backendService 实例吗?

以及在生成上述接口的实现的下面代码中, component.inject(this) 实际上做了什么?

public class Main {

@Inject
BackendService backendService; // 

private MyComponent component;

private Main() {
    component = DaggerMyComponent.builder().build();
    component.inject(this);
}

private void callServer() {
    boolean callServer = backendService.callServer();
    if (callServer) {
        System.out.println("Server call was successful. ");
    } else {
        System.out.println("Server call failed. ");
    }
}

以及为什么没有使用 component.provideBackendService() 获得后端服务

标签: dagger-2dagger

解决方案


目的是void inject(Main main);什么?

它允许您field injection在具体类上执行Main,假设这Main是一个不能由 Dagger 创建的类

上面接口的实现是在哪里生成的,component.inject(this) 到底是做什么的呢?

它使用MemberInjectors 注入标有 的包保护或公共字段@Injectinject(Main)您可以在DaggerMyComponent类中看到方法的实现。


当然,如果可能的话,最好这样做:

1.) Main 不实例化/不知道它自己的注入器

2.) Main 由 Dagger 组件创建,并@Inject使用构造函数

@Singleton
public class Main {    
    private final BackendService backendService;

    @Inject
    Main(BackendService backendService) {
        this.backendService = backendService;
    }
}

推荐阅读