Dagger 注入的简单原理
最简单的使用步骤:
声明一个 Module
@Module
public class MainModule {@ProvidesDog provideDog(){return new Dog("bob");}}
复制代码
声明一个 Component 表明要把哪个 module 注入到哪些对象,如下表示把 MainModule 注入到 MainActivity 对象中,那么在 MainActivity 中就可以随意使用 @Inject
注入 MainModule 中的提供的对象实例。
@Component(modules = MainModule.class)
public interface MainComponent {void inject(MainActivity mainActivity);
}
复制代码
然后我们在 MainActivivty
中使用:
class MainActivity : AppCompatActivity() {@Injectlateinit var dog1: Dogoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)DaggerMainComponent.builder().build().inject(this)TextView.text = "$dog1"}
}
复制代码
就可以不需要 new Dog()
而直接得到一个现成的实例,这背后是怎么实现的呢?一起来看看。
编译之后,dagger 注解处理器会生成 3 个文件:
- DaggerMainComponent
- MainActivity_MembersInjector
- MainModule_ProvideDogFactory
上文中我们注入之前需要在 MainActivity
先初始化一下 DaggerMainComponent.builder().build().inject(this)
注入到当前的类中。
DaggerMainComponent
具体实现了如何把一个 MainModule
注入到 MainActivity
中。
public final class DaggerMainComponent implements MainComponent {private final MainModule mainModule;private DaggerMainComponent(MainModule mainModuleParam) {this.mainModule = mainModuleParam;}public static Builder builder() {return new Builder();}public static MainComponent create() {return new Builder().build();}@Overridepublic void inject(MainActivity mainActivity) {injectMainActivity(mainActivity);}private MainActivity injectMainActivity(MainActivity instance) {MainActivity_MembersInjector.injectDog1(instance, MainModule_ProvideDogFactory.provideDog(mainModule));return instance;}public static final class Builder {private MainModule mainModule;private Builder() {}public Builder mainModule(MainModule mainModule) {this.mainModule = Preconditions.checkNotNull(mainModule);return this;}public MainComponent build() {if (mainModule == null) {this.mainModule = new MainModule();}return new DaggerMainComponent(mainModule);}}
}
复制代码
首先 DaggerMainComponent.Builder
的 build 方法中会先创建一个 MainModule 实例,然后传入 DaggerMainComponent。
然后再看看 inject()
,内部通过 MainActivity_MembersInjector.injectDog1(MainActivity,Dog)
实现,这里的 dog 实例是从 MainModule_ProvideDogFactory.provideDog(mainModule)
这个工厂类获得的。
public final class MainModule_ProvideDogFactory implements Factory<Dog> {private final MainModule module;public MainModule_ProvideDogFactory(MainModule module) {this.module = module;}@Overridepublic Dog get() {return provideDog(module);}public static MainModule_ProvideDogFactory create(MainModule module) {return new MainModule_ProvideDogFactory(module);}public static Dog provideDog(MainModule instance) {return Preconditions.checkNotNull(instance.provideDog(), "Cannot return null from a non-@Nullable @Provides method");}
}复制代码
provideDog()
这个方法很简单,就是判断下实例是必须不能为空。
最后通过 injectDog1()
将 MainActivity
的 dog1
赋值,完成了注入过程。
public static void injectDog1(MainActivity instance, Dog dog1) {instance.dog1 = dog1;}
复制代码
这样一个注入过程就完成了,是不是很简单。
转载于:https://juejin.im/post/5cdbaf5df265da035f6ffb93
Dagger 注入的简单原理相关推荐
- 【Java面试题】21 Java中的异常处理机制的简单原理和应用。
[Java面试题]21 Java中的异常处理机制的简单原理和应用. 参考文章: (1)[Java面试题]21 Java中的异常处理机制的简单原理和应用. (2)https://www.cnblogs. ...
- SQL注入攻击实现原理与攻击过程详解
SQL注入攻击实现原理与攻击过程详解 结构化查询语言(SQL)是一种用来和数据库交互的文本语言,SQL Injection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到 ...
- 关于单点登录的简单原理和实现步骤
关于单点登录的简单原理和实现步骤 一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独 ...
- 中国北斗简单原理随笔
中国北斗简单原理随笔 博主本科大二的时候负责一个海上浮漂的项目,我们移动网络基本距离岸边一般10海里也就完全没有信号了,所有海上目前最为常见的就是卫星通信.而我们使用的就是我们国家自主 ...
- 人工智能-阿尔法狗背后的简单原理:贝叶斯公式
版权声明:本文为博主原创文章,未经博主允许不得转载. AlphaGo为代表的人工智能,彻底的战胜了人类的围棋大师,震撼了全世界,那么人工智能的背后,有着怎样的科技在支撑?本文要介绍的就是人工智能背后的 ...
- SQL注入之基础原理
SQL注入之基础原理 一.SQL注入的产生 SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序 ...
- C++ 智能指针的简单原理
C++ 智能指针的简单原理 为什么会有智能指针的原因 delete引起的内存泄漏 智能指针的使用及其原理 RAII auto_ptr std::unique_ptr std::shared_ptr(线 ...
- 利用php实现图片相似度搜索的简单原理
几天看到阮一峰的博客里写到关于相似图片搜索的原理, 里面介绍了Google相似图片搜索的大致原理,主要是从Neal Krawetz博士的LOOKS LIKE IT翻译而来.文章详细的介绍了相似图片搜索 ...
- 第9节 路由表的分类及路由器简单原理
路由表的分类及路由器简单原理 0 摘要 1 路由概述 2 路由表 2.1 路由表概述 2.2 路由表的分类 2.3 检查路由表的先后顺序 3 路由器工作原理 3.2 工作原理 3.2 交换机与路由器的 ...
- HC595简单原理及proteus仿真(一)草履虫能听懂版
简单原理 目录 简单原理 简介: 特性 : 引脚功能: proteus仿真 接线: 注意: SH_CP,ST_CP,DS如何工作 实验一: 实验一: 实验三: END: hc595是具有三态输出寄存器 ...
最新文章
- Javaweb环境配置,使用2014MyEclipse全过程详解!搭建JDK环境,Tomcat环境!破解2014MyEclipse。
- 《基于压缩传感的匹配追踪重建算法研究》读书笔记
- Oracle 与SQL Server 2000常用函数对照 [摘抄]
- 其实不的免费图标网站
- SAP 使用ST05跟踪方法
- MySQL学习_计算用户支付方式占比_20161104
- 十大垃圾专业 计算机,十大最好专业和最烂专业是什么
- 如何用spring boot写一个注册页面
- 算法系列之选择排序算法
- 微信小程序之自定义模态弹窗(带动画)实例
- python中的t操作_Python: s[i:j:k] = t 实现的是什么操作啊?
- 处理quartz 异常 Couldn‘t retrieve trigger: No record found for selection of Trigger with key:
- Hadoop2.2.0 + HBase0.96 伪分布式安装
- 集腋成裘-13-git使用-02进阶篇
- win10 myeclipse2017安装教程(附安装包)
- 五、Ceph之RBD存储使用
- 大理大学 计算机研究生分数线,大理大学2018年研究生复试分数线
- 利用OA系统进行档案管理原来这么简单?
- office的笔记本:OneNote使用技巧
- 2020-10-20 Ant Design Vue 关闭国际化设置默认语言为中文的
热门文章
- centos安装python3、redis和虚拟环境
- POJ 2068 NIm (dp博弈,每个人都有特定的取最大值)
- Eclipse中启动tomcat: java.lang.OutOfMemoryError: PermGen space的解决方法
- 【C++】双边滤波器(bilateral filter)
- 在free bsd上跑JMeter 的 plugin PerfMon Server Agent
- 单点登录相关问题总结
- 如何把手机变成你的救生设备
- 关于STM32 __IO 的变量定义
- 科研不是比赛,而是一种对未知和完美的自我追求——跟邢波(Eric Xing)面对面聊科研...
- WSS3 Elevation of Privilege 替代 用户身份模拟Impersonate 进行权限提升