dagger-2 - 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() 获得后端服务
解决方案
目的是
void inject(Main main);
什么?
它允许您field injection
在具体类上执行Main
,假设这Main
是一个不能由 Dagger 创建的类
上面接口的实现是在哪里生成的,component.inject(this) 到底是做什么的呢?
它使用MemberInjector
s 注入标有 的包保护或公共字段@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;
}
}
推荐阅读
- microsoft-graph-api - 如何根据存储在数据扩展中的值过滤 Outlook 消息?
- c - 将 .wav 文件转换为 C 代码,在 ARM 处理器中不输出声音
- c# - 尝试使用从 CurrentUser Store 检索到的证书的私钥时出错
- google-apps-script - gmail内的Apps脚本登录表单
- kubernetes - 基于 Istio 版本的路由导致 404
- mongodb - 按对象 ID 查找文档 - 将字符串转换为对象 ID
- python - 多个功能,但一个失败
- react-native - 通话需要几秒钟
- javascript - 如何将 Chart.js chartjs-plugin-datalabels npm 包导入 Angular 7 项目
- ansible - Ansible 在变量中使用变量