本系列只讲使用方法和使用中遇到的问题,如果还对dagger2还不了解的童鞋儿可以参考文章:

http://www.jianshu.com/p/cd2c1c9f68d4

http://www.jianshu.com/p/94d47da32656

  使用Dagger2的前提需要添加一些依赖:

    1  在Project的 build.gradle文件添加以下内容

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. }
  5. dependencies {
  6. classpath 'com.android.tools.build:gradle:2.1.0'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
  7. }
  8. }

   2  在Module下的build.gradle添加以下内容 

  1. apply plugin: 'com.android.application'
    apply plugin: 'com.neenbedankt.android-apt'
  1. dependencies {
  2. apt 'com.google.dagger:dagger-compiler:2.4'
  3. compile 'com.google.dagger:dagger:2.4'
  4. provided 'org.glassfish:javax.annotation:10.0-b28'
  5. } 

  下面我们学习一下Dagger2的使用。

<一>目标类和被依赖的类,都是我们直接可修改的。

  1  在被依赖类的构造函数上使用@inject注解

  1. public class NeedProvide {
  2. @Inject
  3. public NeedProvide(){
  4. }
  5.  
  6. public void printMethod(){
  7. Log.d("Dagger.class","NeedProvide----printMethod()");
  8. }
  9. }

  2  创建Component,作为目标类和被依赖类的桥梁,并被@Component注解

  1. @Component
  2. public interface NeedComponent {
  3. void inject(TargetActivity activity);
  4. }

  3  运行一下,让项目生产XXXComponent

  4  在目标类中利用XXXComponent进行依赖注入

  1. DaggerNeedComponent.builder().build().inject(this);

  5  依赖注入完毕后,通过@inject使用被依赖类

  1. public class TargetActivity extends AppCompatActivity {
  2.  
  3. @Inject
  4. NeedProvide mNeedProvide;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10.  
  11. DaggerNeedComponent.builder().build().inject(this);
  12. mNeedProvide.printMethod();
  13. }
  14. }

  这里有三种角色。目标类TargetActivity,被依赖类NeedProvide,桥梁NeedComponent。

  这种方法适用于目标类和被依赖类都是我们自己创建的时候。在使用第三方库的时候,无法直接在类构造函数中添加@Inject注解。或者被依赖类有多个构造函数的时候,不能注解多个构造函数,这样会产生歧义,因为Dagger2无法确认调用哪一个构造函数,来生成类的实例对象。此时这种方法就失效了,下面请看第二种方法。

<二>创建Module提供我们被依赖类,使用@Provides注解修饰

  这种方法步骤和上面一样,只不过修改我们添加一些注解,直接看代码。

被依赖类:  

  1. public class NeedProvideS {
  2.  
  3. public NeedProvideS(){
  4. }
  5.  
  6. public void printMethod(){
  7. Log.d("Dagger.class","NeedProvideS----printMethod()");
  8. }
  9.  
  10. }  

  这里将NeedProvideS类构造器上的@inject注解去掉了(不去掉也行,此处为了防止第一种方法对本次影响)。

被依赖类的封装类即Module:           

  1. @Module
  2. public class ProvideModuleS {
  3.  
  4. @Provides
  5. public NeedProvideS provideNeedProvide(){
  6. return new NeedProvideS();
  7. }
  8.  
  9. }

  使用Module封装被依赖类的目的在之前说过。此处我们看看这个类,类上用@Module注解修饰,方法是提供被依赖类的,所以用@Provides修饰,目的是为了让dagger能够查找到。

  1. @Module
  2. public class ProvideModuleS {
  3.  
  4. @Provides
  5. public NeedProvideS provideNeedProvide(Bean bean){
  6. return new NeedProvideS(bean);
  7. }
  8.  
  9. @Provides
  10. public Bean provideBean(){
  11. return new Bean();
  12. }
  13.  
  14. }

  当我们某一个方法需要参数的时候,它会自动去查找本类其他被@Module注解修改的方法。

桥梁:

  1. @Component(modules = ProvideModuleS.class)
  2. public interface NeedComponentS {
  3. void inject(TargetActivityS activity);
  4. }

  此处使用了modules属性,指定提供封装了被依赖类的封装类。Component还可以依赖多个Module。下篇会讲。

目标类:

  1. public class TargetActivityS extends AppCompatActivity {
  2.  
  3. @Inject
  4. NeedProvideS mNeedProvideS;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10.  
  11. DaggerNeedComponentS.builder().build().inject(this);
  12. mNeedProvideS.printMethod();
  13. }
  14. }

  上面我们介绍了dagger2使用的两种方法,那如果实际情况中,两种方法都用,那么默认会先使用哪种方法创建实列那?其实在构建类实例的时候,会按照以下顺序执行:

从Module中查找类实例创建方法

  1. Module中存在创建方法,则看此创建方法有没有参数
    1. 如果有参数,这些参数也是由Component提供的,返回步骤1逐一生成参数类实例,最后再生成最终类实例
    2. 如果无参数,则直接由这个方法生成最终类实例
  2. Module中没有创建方法,则从构造函数里面找那个用@Inject注解的构造函数
    1. 如果该构造函数有参数,则也是返回到步骤1逐一生成参数类实例,最后调用该构造函数生成类实例
    2. 如果该构造函数无参数,则直接调用该构造函数生成类实例

  以上就是一次注入生成类实例的生成步骤。(copy others,原文链接:http://www.jianshu.com/p/94d47da32656)

  Dagger2最基本的使用方法已经介绍完毕了,下一遍我会讲解我在实际使用的时候遇到的问题。

Dagger2系列之使用方法的更多相关文章

  1. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  2. 在keil 4中添加stc系列芯片的方法--【sky原创】

    在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...

  3. 电容值E系列标称方法

    本节首先介绍常用的E系列标称方法,然后介绍电阻.电容器.电感器.二极管的分类.性能和识别方法,以及简单的实用电路. 一.E系列标称方法 厂家生产的电阻器,并不是包含任何阻值,就像人民币,只有1.2.5 ...

  4. Python科普系列——类与方法(下篇)

    书接上回,继续来讲讲关于类及其方法的一些冷知识和烫知识.本篇将重点讲讲类中的另一个重要元素--方法,也和上篇一样用各种神奇的例子,从原理和机制的角度为你还原一个不一样的Python.在阅读本篇之前,推 ...

  5. .Net中的AOP系列之《方法执行前后——边界切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...

  6. 破解 Adobe 系列的最佳方法,手把手教

    此方法是个人认为最方便的而且最安全的方法(可以避免下载到可能捆绑病毒的破解版本) 1.首先到Adobe的官网上下载 Creative Cloud: 打开官网上creative cloud 的下载页面: ...

  7. Python科普系列——类与方法(上篇)

    欢迎来到新的系列,up又开新坑了~~ 实际上,Python作为一门易用性见长的语言,看上去简单,却仍然有很多值得一说的内容,因此这个系列会把Python中比较有意思的地方也给科普一遍.而另一方面,关于 ...

  8. html基础 表单标签 input系列 以及优化方法

    场景:在网页中显示手机用户信息的表单效果. 如:登录页.注册页标签名:input 用法是通过改变type属性值,来展示不同效果 1.1 html 代码 <!--placeholder 提示符又叫 ...

  9. dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent

    本篇是实战文章,从代码的角度分析这两种方式.本文参考自下列文章: http://www.jianshu.com/p/1d42d2e6f4a5 http://www.jianshu.com/p/94d4 ...

随机推荐

  1. 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!

    如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...

  2. 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用

    问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...

  3. Matlab slice方法和包络法绘制三维立体图

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  4. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...

  5. Collection集合

    一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(C ...

  6. APEX:对object中数据进行简单处理?

    在Salesforce中,常常要对各种数据进行处理,已满足业务逻辑.本篇文章会介绍如何实现从object获取数据,然后将取得的数据进行一系列简单处理. 第一步:SongName__c 是一个新建的ob ...

  7. H3 BPM:为石化企业提供一个不一样的全停大修平台

    H3 BPM大型炼化企业装置全停检修管理平台(简称"全停大修")结合国际化的流程管理理念.成熟的系统技术架构.优秀的行业解决方案,为石油化工行业全停大修提供了卓越的信息化管理方案, ...

  8. 关于sqlmap的使用

    好记性不如烂笔头,记录一下. 带cookie的注入 python sqlmap.py -u "http://www.xxx.com?id=1" --cookie="coo ...

  9. Ubuntu Server(Ubuntu 14.04 LTS 64位)安装libgdiplus2.10.9出错问题记录

    首先下载libgdiplus2.10.9安装包 wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.9.t ...

  10. Centos、Ubuntu 安装 Mono、Jexus

    Mono是.NET的跨平台实现 在众多关于语言的争论中,.NET一直被以不能跨平台而诟病,Mono改变了这一现状. 有人当心Mono会涉及版权啥的问题.高深的偶不懂,不过我觉得Unity3D都能用,为 ...