Dagger2的基本概念与实际应用。
本文系原创博客,文中不妥烦请指出,如需转载摘要请注明出处!
Dagger2的基本概念与实际应用
Alpha Dog
2016-11-30 10:00:00
本文Demo的github地址:https://github.com/DarkPointK/MyTestApplication.git
最近2天看了几篇关于Dagger2的博文,一开始是云里雾里,后来尝试着动手才整理出思绪,恍然大悟。在Dagger2对于程序的解耦有了更深一层的认识!现在将自己的理解整理出来,希望能帮到正在学习的同志!
想要在项目里应用Dagger2先从配置Gradle开始:
- 在项目级build.gradle的buildScript块中添加dependencies: classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
- 在app级的build.gradle中应用gradle插件: apply plugin: 'com.neenbedankt.android-apt' ;添加dependencies:compile 'com.google.dagger:dagger:2.6' apt 'com.google.dagger:dagger-compiler:2.6'
至此,我们的资源就准备就绪了,对于还不了解Dagger2概念的读者我用一句话来概括下它的作用:Dagger2让我们得以利用注解的形式以任意初始化声明一些个对象,也就是说省去了new Object(); 这一个操作。下一步开始将Dagger2的Module与Component运用起来,在这里再解释一下这两个概念:首先Module字面意思是模块,它本质上是一个class类,里面存放着可以返回给Dagger2使用的对象实例的方法(可以理解为get()方法获取一个对象的操作);而Component则用于是装载Module的一个组件,它可以依赖或被其他Component依赖。接下来将给出个典型的例子跟明了的将这两个概念展现出来。
想要了解Dagger2,就必须要知道依赖注入的基础和这其中的每一个概念:
该引用摘自 http://blog.csdn.net/wds1181977/article/details/51822043
@Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的@Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。
@Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。
Qualifier: 当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示。例如:在Android中,我们会需要不同类型的context,所以我们就可以定义 qualifier注解“@ForApplication”和“@ForActivity”,这样当注入一个context的时候,我们就可以告诉 Dagger我们想要哪种类型的context。
这里我们定义了一个叫AppMod的Module,它有俩个构造方法,和一个叫getPoint的方法返回了一个Point对象。因为这个方法的存在,后续注入实例时,Dagger2便可以从这个方法获取。
这是一个非常简洁的Component,它实质是个接口,且只装载了一个Module,并定义了getPoint方法以暴露出去被其他Component依赖上。
这同样是个Component,与前面AppComponent不同的是,它依赖了一个Component(可以理解为继承了AppComponent)并拥有被依赖Component所暴露出的方法,在这里即是Point getPoint(); 。其中inject方法用于在后期使用时主动初始化该Component。另外上面使用到一个叫AppScope的注解,定义了对象的存活时间:
不错,现在我们已经有了一个完善的Component可以被拿来使用了!在正式使用之前,还得先Rebuild Project一下项目,因为这样Dagger2才能根据我们写的Module和Component自动生成一些代码。Rebuild Project之后:
加载Component。使用Dagger+"自定义的Component名"来调用builder()方法并build。
最后,取得并调用Component的inject方法,并使用@Inject对对象进行注入。
至此,基本的Dagger2的使用方法大家应该都掌握了,根据这一概念,我们可以将它花式运用起来,给Component装载各种Module,给各种对象进行注入,Dagger2在注入时都会自动的搜寻符合该对象的方法。
最新文章
- 游戏服java程序启动,显示内存溢出
- zend 汉化
- 读书笔记——Windows环境下32位汇编语言程序设计(3)求复数模的子程序
- 解决Win10默认占用80端口
- Tips for android
- [效果]JS折叠菜单-使用方法 (Moo.Fx)
- java对身份证验证及正则表达式解析
- ArrayList与LinkedList实现比较
- 如何用ATL创建ActiveX控件
- .net通用权限框架B/S (五)--WEB(2)登录
- 字符串拼接 拆分 NameValueCollection qscoll = HttpUtility.ParseQueryString(result)
- String的Intern方法详解
- openvpn实现内网 映射到 外网
- 虚拟机通信配置与Xshell连接
- MySQL binlog 日志
- Codeforces Round #485 (Div. 2)-B-High School: Become Human
- 000 Security的计划
- Socket网络编程--聊天程序(8)
- readv writev示例程序
- 【BZOJ2059】Buying Feed 购买饲料