Dagger2系列之使用方法
本系列只讲使用方法和使用中遇到的问题,如果还对dagger2还不了解的童鞋儿可以参考文章:
http://www.jianshu.com/p/cd2c1c9f68d4
http://www.jianshu.com/p/94d47da32656
使用Dagger2的前提需要添加一些依赖:
1 在Project的 build.gradle文件添加以下内容
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
2 在Module下的build.gradle添加以下内容
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
apt 'com.google.dagger:dagger-compiler:2.4'
compile 'com.google.dagger:dagger:2.4'
provided 'org.glassfish:javax.annotation:10.0-b28'
}
下面我们学习一下Dagger2的使用。
<一>目标类和被依赖的类,都是我们直接可修改的。
1 在被依赖类的构造函数上使用@inject注解
public class NeedProvide {
@Inject
public NeedProvide(){
}
public void printMethod(){
Log.d("Dagger.class","NeedProvide----printMethod()");
}
}
2 创建Component,作为目标类和被依赖类的桥梁,并被@Component注解
@Component
public interface NeedComponent {
void inject(TargetActivity activity);
}
3 运行一下,让项目生产XXXComponent
4 在目标类中利用XXXComponent进行依赖注入
DaggerNeedComponent.builder().build().inject(this);
5 依赖注入完毕后,通过@inject使用被依赖类
public class TargetActivity extends AppCompatActivity {
@Inject
NeedProvide mNeedProvide;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerNeedComponent.builder().build().inject(this);
mNeedProvide.printMethod();
}
}
这里有三种角色。目标类TargetActivity,被依赖类NeedProvide,桥梁NeedComponent。
这种方法适用于目标类和被依赖类都是我们自己创建的时候。在使用第三方库的时候,无法直接在类构造函数中添加@Inject注解。或者被依赖类有多个构造函数的时候,不能注解多个构造函数,这样会产生歧义,因为Dagger2无法确认调用哪一个构造函数,来生成类的实例对象。此时这种方法就失效了,下面请看第二种方法。
<二>创建Module提供我们被依赖类,使用@Provides注解修饰
这种方法步骤和上面一样,只不过修改我们添加一些注解,直接看代码。
被依赖类:
public class NeedProvideS {
public NeedProvideS(){
}
public void printMethod(){
Log.d("Dagger.class","NeedProvideS----printMethod()");
}
}
这里将NeedProvideS类构造器上的@inject注解去掉了(不去掉也行,此处为了防止第一种方法对本次影响)。
被依赖类的封装类即Module:
@Module
public class ProvideModuleS { @Provides
public NeedProvideS provideNeedProvide(){
return new NeedProvideS();
} }
使用Module封装被依赖类的目的在之前说过。此处我们看看这个类,类上用@Module注解修饰,方法是提供被依赖类的,所以用@Provides修饰,目的是为了让dagger能够查找到。
@Module
public class ProvideModuleS { @Provides
public NeedProvideS provideNeedProvide(Bean bean){
return new NeedProvideS(bean);
} @Provides
public Bean provideBean(){
return new Bean();
} }
当我们某一个方法需要参数的时候,它会自动去查找本类其他被@Module注解修改的方法。
桥梁:
@Component(modules = ProvideModuleS.class)
public interface NeedComponentS {
void inject(TargetActivityS activity);
}
此处使用了modules属性,指定提供封装了被依赖类的封装类。Component还可以依赖多个Module。下篇会讲。
目标类:
public class TargetActivityS extends AppCompatActivity {
@Inject
NeedProvideS mNeedProvideS;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerNeedComponentS.builder().build().inject(this);
mNeedProvideS.printMethod();
}
}
上面我们介绍了dagger2使用的两种方法,那如果实际情况中,两种方法都用,那么默认会先使用哪种方法创建实列那?其实在构建类实例的时候,会按照以下顺序执行:
从Module中查找类实例创建方法
- Module中存在创建方法,则看此创建方法有没有参数
- 如果有参数,这些参数也是由Component提供的,返回步骤1逐一生成参数类实例,最后再生成最终类实例
- 如果无参数,则直接由这个方法生成最终类实例
- Module中没有创建方法,则从构造函数里面找那个用@Inject注解的构造函数
- 如果该构造函数有参数,则也是返回到步骤1逐一生成参数类实例,最后调用该构造函数生成类实例
- 如果该构造函数无参数,则直接调用该构造函数生成类实例
以上就是一次注入生成类实例的生成步骤。(copy others,原文链接:http://www.jianshu.com/p/94d47da32656)
Dagger2最基本的使用方法已经介绍完毕了,下一遍我会讲解我在实际使用的时候遇到的问题。
Dagger2系列之使用方法的更多相关文章
- MVC学习系列4--@helper辅助方法和用户自定义HTML方法
在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...
- 在keil 4中添加stc系列芯片的方法--【sky原创】
在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...
- 电容值E系列标称方法
本节首先介绍常用的E系列标称方法,然后介绍电阻.电容器.电感器.二极管的分类.性能和识别方法,以及简单的实用电路. 一.E系列标称方法 厂家生产的电阻器,并不是包含任何阻值,就像人民币,只有1.2.5 ...
- Python科普系列——类与方法(下篇)
书接上回,继续来讲讲关于类及其方法的一些冷知识和烫知识.本篇将重点讲讲类中的另一个重要元素--方法,也和上篇一样用各种神奇的例子,从原理和机制的角度为你还原一个不一样的Python.在阅读本篇之前,推 ...
- .Net中的AOP系列之《方法执行前后——边界切面》
返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...
- 破解 Adobe 系列的最佳方法,手把手教
此方法是个人认为最方便的而且最安全的方法(可以避免下载到可能捆绑病毒的破解版本) 1.首先到Adobe的官网上下载 Creative Cloud: 打开官网上creative cloud 的下载页面: ...
- Python科普系列——类与方法(上篇)
欢迎来到新的系列,up又开新坑了~~ 实际上,Python作为一门易用性见长的语言,看上去简单,却仍然有很多值得一说的内容,因此这个系列会把Python中比较有意思的地方也给科普一遍.而另一方面,关于 ...
- html基础 表单标签 input系列 以及优化方法
场景:在网页中显示手机用户信息的表单效果. 如:登录页.注册页标签名:input 用法是通过改变type属性值,来展示不同效果 1.1 html 代码 <!--placeholder 提示符又叫 ...
- dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
本篇是实战文章,从代码的角度分析这两种方式.本文参考自下列文章: http://www.jianshu.com/p/1d42d2e6f4a5 http://www.jianshu.com/p/94d4 ...
随机推荐
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...
- Socket聊天程序——客户端
写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...
- Js new到底发生了什么
在Js中,我们使用了new关键字来进行实例化 那么在这个new的过程中到底发生了什么? 关于构造函数的return 正常来讲构造函数中是不用写return语句的,因为它会默认返回新创建的对象. 但是, ...
- react-redux
1. 首先redux,与react是两个独立的个体,项目中可以只用react,也可以只用redux 1.1 react-redux: 是一个redux作者专门为react制作的 redux, 增加了新 ...
- 拼图小游戏之计算后样式与CSS动画的冲突
先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...
- JQuery中的siblings()是什么意思
jQuery siblings() 方法返回被选元素的所有同胞元素,并且可以使用可选参数来过滤对同胞元素的搜索. 实例演示:点击某个li标签后将其设置为红色,而其所有同胞元素去除红色样式. 1.创建H ...
- org.jboss.deployment.DeploymentException: Trying to install an already registered mbean: jboss.jca:service=LocalTxCM,name=egmasDS
17:34:37,235 INFO [Http11Protocol] Starting Coyote HTTP/1.1 on http-0.0.0.0-8080 17:34:37,281 INFO [ ...
- Spring异步功能
使用 Spring 的异步功能时,实质是使用的 Servlet3 及以上版本的异步功能. Spring 的异步处理机制需要在 web.xml 中全部的 servlet 和 filter 处配置 < ...
- java I/O流
输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...