dagger2系列之生成类实例(自己)

  上一节的最后,我讲到一次注入生成类实例的生成步骤。先来回顾一下:

   1  Module中存在创建方法,则看此创建方法有没有参数

      如果有参数,这些参数也是由Component提供的,返回步骤1逐一生成参数类实例,最后再生成最终类实例--ok

      如果无参数,则直接由这个方法生成最终类实例

   2    Module中没有创建方法,则从构造函数里面找那个用@Inject注解的构造函数

      如果该构造函数有参数,则也是返回到步骤1逐一生成参数类实例,最后调用该构造函数生成类实例

      如果该构造函数无参数,则直接调用该构造函数生成类实例

  本节就是验证这些步骤是否可行!!!无参数在上一节中已经介绍过了,所以此处验证都是带参数的

<一>Module中存在创建方法,有参数

    按照上面的步骤,它会先看Component提供的Module有没有提供这个参数,没有的话找这个参数实体类的构造函数生成实例(@inject)。

    1  被依赖类和参数的实体类都是由Module创建

NeedProvide3实例

public class NeedProvide3 {

    public NeedProvide3(Bean3 bean){
    }

    public void printMethod(){
        Log.d("Dagger.class","NeedProvide3----printMethod()");
    }

}

  注意这里的构造器没有用@inject注解修饰,因为这个类的实例要由Module提供。

参数Bean3

public class Bean3 {
    public Bean3(){
        Log.d("Dagger.class","-------bean3");
    }
}

  注意这里的构造器没有用@inject注解修饰,因为这个类的实例要由Module提供。

提供NeedProvide3实例

@Module
public class ProvideModule31 {

    @Provides
   public NeedProvide3 provideNeedProvide(Bean3 bean){
        return  new NeedProvide3(bean);
   }

}

提供参数Bean3

@Module
public class ProvideModule32 {

    @Provides
    public Bean3 provideBean(){
        return new Bean3();
    }

}

桥梁Component

@Component(modules={ProvideModule31.class, ProvideModule32.class})
public interface NeedComponent3 {
    void inject(TargetActivity3 activity);
    Bean3 getBean();//方法名字随意
}

  这里需要提供一个方法,当寻找参数的时候会用到,不写会报错!!!

目标类

public class TargetActivity3 extends AppCompatActivity {

    @Inject
    NeedProvide3 mNeedProvide3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerNeedComponent3.builder().build().inject(this);
        Log.d("Dagger.class","qian----");
        mNeedProvide3.printMethod();
        Log.d("Dagger.class","--------hou");

    }
}

  运行看下打印结果:

  

  2  被依赖类的参数由Module提供,参数由@inject方式创建

这里只有两个类需要改动,这里只贴出这两个类的代码:

参数类:用@inject注解修饰

public class Bean3 {
    @Inject
    public Bean3(){
        Log.d("Dagger.class","-------bean3");
    }
}

桥梁Component:删掉了提供Bean3的Module,让Bean3实例由@inject注解创建

@Component(modules={ProvideModule31.class})
public interface NeedComponent3 {
    void inject(TargetActivity3 activity);
}

  运行的打印结果和上面的是一样的,说明这两种方法都可以的!!!

<二>Module中不创建方法,有参数

  1  Module中提供参数,被依赖类通过构造器的@inject方式创建

被依赖类:通过@inject方式创建实例

public class NeedProvide4 {
    @Inject
    public NeedProvide4(Bean4 bean){
    }

    public void printMethod(){
        Log.d("Dagger.class","NeedProvide4----printMethod()");
    }
}

参数Bean4:无@inject注解

public class Bean4 {
    public Bean4(){
        Log.d("Dagger.class","-------bean");
    }
}

提供参数:

@Module
public class ProvideModule4 {

    @Provides
    public Bean4 provideBean(){
        return new Bean4();
    }

}

桥梁Component

@Component(modules = ProvideModule4.class)
public interface NeedComponent4 {
    void inject(TargetActivity4 activity);
}

  运行打印的结果为:

2  被依赖类和参数的实体类都由@inject方式创建

桥梁Component

@Component
public interface NeedComponent4 {
    void inject(TargetActivity4 activity);
}

  被依赖类和参数都需要在构造器上使用@inject注解修饰。此处就不贴代码了,运行之后的打印结果和上面的一样。

  本篇主要验证开头所讲的步骤中涉及到的那几种方法是否行的通。最后总结如下:

    1  参数和被依赖类的实例化有两种方法,Module和@inject方式。

    2  当创建依赖类需要参数的时候,参数的实例化有两种方法

        1>Module提供:

          如果依赖类和参数都是Module提供(不由同一个Module提供),那么需要在Component中声明一个方法显示提供,方法名字任意。

        2>@inject方式:

时间: 2024-12-18 00:47:52

dagger2系列之生成类实例(自己)的相关文章

Java JUC之Atomic系列12大类实例讲解和原理分解

Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21      0个评论       作者:xieyuooo 收藏    我要投稿 在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的ABA问题,本文讲述Atomic系列的类的实现以及使用方法,其中包含: 基本类:AtomicInteger.AtomicLong.Atomic

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.an

java生成excel文件工具类实例

import java.io.File; import java.io.IOException; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; import org.

C#获取哈希加密生成随机安全码的类实例

本文实例讲述了C#获取哈希加密生成随机安全码的类.分享给大家供大家参考.具体分析如下: 这个C#类封装了一些hash加密的功能,可以用于得到随机哈希加密字符串使用非常方便 using System; using System.Text; using System.Security.Cryptography; namespace DotNet.Utilities { /// <summary> /// 得到随机安全码(哈希加密). /// </summary> public clas

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装  (5):前台Jquery easyUI实现 前言:通过前面的五篇博客我们已经对权限系统的后台架构进行了详细的说明,那么我再前面的博客中也说到了我们的后台架构还会再改的,我准备这段时间我们继续完善我们的后台

Struts2 源码分析——Result类实例

本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容进行讲解.笔者叫他们为Result类实例.如果还记得在上一章最后笔者说可以把处理action执行的结果简单的理解处理网页.而且还用红色标识.实际是处理跟表现层有关的内容.而不是页面上的内容.如HTML.即是MVC里面的C到V的内容.当然这还关系到配置文件里面的result元素节点信息.如strtus

使用反射和泛型,动态读取XML创建类实例并赋值

[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能.网上的例子倒也不少,但总是觉得缺点什么.比如读取xml文件之后该如何处理?看到的文章基本上都是手动创建一个目标类的实例,然后手动从读取的XML文件的内容中给刚才创建的目标类实例相关字段赋值.缺点什么呢?对嘞,感觉上

C# Oracle数据库操作类实例详解

本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长度等,同时还有哈稀表自动插入数据库等高级任务.需要特别指出的是:在执行SQL语句,返回 DataReader之前一定要先用.read()打开,然后才能读到数据,再用hashTable对数据库进行insert,update,del操作,注意此时只能用默认的数据库连接"connstr". 本文

Win10系列:JavaScript综合实例1

上面几个小节讲解了使用HTML5和JavaScript语言开发Windows 应用商店应用时会用到的一些技术,本小节将前面介绍的知识融合在一起创建一个菜谱应用程序,帮助读者更进一步地理解和掌握这些知识. 此菜谱应用程序主要的功能是介绍一些菜肴和主食的做法,其中包含三个页面:第一个页面为主页面,用于按类别显示一些菜肴和主食:第二个页面为分类页面,显示某个类别的信息和属于该类别的菜肴或主食:第三个页面为菜肴页面,显示某项菜肴或主食的详细信息,如名称.图片和具体做法.这三个页面可以相互跳转,例如,在主