匕首组件体

时间:2018-05-26 18:11:10

标签: dagger-2 dagger

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

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()获得后端服务

1 个答案:

答案 0 :(得分:1)

  

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

它允许您对具体类field injection执行Main,假设Main不能创建的类<​​/ p>

  

生成上述接口的实现,component.inject(this)实际上做了什么?

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

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

1。)Main不会实例化/了解自己的注射器

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

@Singleton
public class Main {    
    private final BackendService backendService;

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