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

   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方式:

dagger2系列之生成类实例的更多相关文章

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

    Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21      0个评论       作者:xieyuooo 收藏    我要投稿 在java6以后我们不但接触到了Loc ...

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

    在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的AB ...

  3. Dagger2系列之使用方法

    本系列只讲使用方法和使用中遇到的问题,如果还对dagger2还不了解的童鞋儿可以参考文章: http://www.jianshu.com/p/cd2c1c9f68d4 http://www.jians ...

  4. XAML实例教程系列 - XAML传递参数到值转换类实例 八

    Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - XAML传递参数到值转换类实例 2012-06-28 05:25 by jv9, 508 阅读, 0 评论, 收藏, 编辑 继上 ...

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

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ( ...

  6. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  7. Struts2 源码分析——Result类实例

    本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容 ...

  8. 转:c++类实例在内存中的分配

    转自:http://blog.csdn.net/alexwei2009/article/details/6157926 c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由 ...

  9. XML之自动生成类,添加,修改,删除类的属性

    1. class ClassHelperDemo { public static void Main() { #region 演示一:动态生成类. //生成一个类t. Type t = ClassHe ...

随机推荐

  1. 基于本地存储的kvm虚拟机在线迁移

    基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...

  2. 05.LoT.UI 前后台通用框架分解系列之——漂亮的时间选择器

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  3. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  4. .NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍

    1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过 ...

  5. 苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事

    WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输.本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法. 几周前,我们在<htt ...

  6. WebApi接口 - 如何在应用中调用webapi接口

    很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...

  7. UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)

    前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...

  8. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. PHP之购物车的代码

    该文章记录了购物车的实现代码,仅供参考 book_sc_fns.php <?php include_once('output_fns.php'); include_once('book_fns. ...

  10. IOS FMDB 获取数据库表和表中的数据

    ios开发中,经常会用到数据库sqlite的知识,除了增,删,改,查之外,我们说说如何获取数据库中有多少表和表相关的内容. 前言 跟数据库使用相关的一般的增删改查的语句,这里就不做解释了.在网上有很多 ...