我对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()获得后端服务
答案 0 :(得分:1)
void inject(Main main);
的目的是什么?
它允许您对具体类 生成上述接口的实现,component.inject(this)实际上做了什么? 它使用 当然,如果可能最好这样做: 1。)Main不会实例化/了解自己的注射器 2。)Main由Dagger组件创建,使用field injection
执行Main
,假设Main
是
MemberInjector
来注入标有@Inject
的受包保护或公共字段。您可以在inject(Main)
类中看到DaggerMyComponent
方法的实现。@Inject
构造函数@Singleton
public class Main {
private final BackendService backendService;
@Inject
Main(BackendService backendService) {
this.backendService = backendService;
}
}