将Dagger系列的咖啡壶样例再做一下简化,作为Dagger2的入门的第一个小样例。

场景描写叙述:有一个电水壶,它使用一个加热器来烧水。电水壶具备的功能有:開始加热(on方法),结束加热(off方法),倒水(brew方法)。

正确使用Dagger2要依照下面5个步骤来进行:

1.确定依赖对象和被依赖对象

本例中。水壶是依赖对象(dependent object),加热器是被依赖对象(dependent object’s dependency)。而与此同一时候,加热器本身并不依赖谁,所以它是一个独立的个体(independent
model)。

加热器:src/bean/Heater.java

public class Heater {
private boolean isHot;
public void on(){
System.out.println("開始烧开水啦");
isHot = true;
}
public void off(){
System.out.println("关闭加热器");
isHot = false;
}
public boolean isHot(){
return isHot;
}
}

电水壶:src/bean/Kettle.java

public class Kettle {
private Heater heater;//电水壶依赖于加热器 public Kettle(Heater heater) {
super();
this.heater = heater;
}
public void on(){
heater.on();
}
public void off(){
heater.off();
}
public void brew(){
if(heater.isHot()){
System.out.println("倒一杯开水");
}
}
}

2.创建@Module类

Module类的作用就是提供各种方法,来返回满足依赖关系的对象。这些方法须要加入上@Provides注解。

src/module/KettleModule.java

@Module
public class KettleModule {
@Singleton
@Provides
Heater providesHeater(){
return new Heater();
}
@Singleton
@Provides
Kettle providesKettle(Heater heater){
return new Kettle(heater);
}
}

3.当有了@Module类,提供所需的依赖和被依赖对象,那么我们就在须要的地方进行取用就可以。

取用的方式是通过@Inject注解。如今改动下面之前的Kettle类:

<pre name="code" class="java" style="font-size: 18px;">public class Kettle {
private Heater heater;//电水壶依赖于加热器
<span style="color:#ff6666;">@Inject</span>
public Kettle(Heater heater) {
super();
this.heater = heater;
}
public void on(){
heater.on();
}
public void off(){
heater.off();
}
public void brew(){
if(heater.isHot()){
System.out.println("倒一杯开水");
}
}
}

唯一改动的就是为构造器加入了@Inject注解。

Dagger2中。@Inject注解能够加入在构造器、方法和属性本身的前面。本例就通过构造器进行注入。

4.创建一个接口,让@Inject和@Module建立起联系

写一个接口,并用@Component进行注解。该注解有一个属性module。它用来指明与@Inject建立联系的将是哪一个(或哪一些)@Module类。假设@Inject和@Module匹配正确,那么在接口中定义的方法的返回值对象,都将是被正确注入了依赖关系的对象了:

src/module/KettleComponent:

@Singleton
@Component(modules=KettleModule.class)
public interface KettleComponent {
Kettle providesKettle();
}

5.获得第4步中声明的接口对象的实例,进而获得接口中定义方法的返回值

@Component接口的实现类由Dagger2自己主动生成。这个类的命名规范是Dagger前缀加上@Component类的名称,那么本例中,这个类的名称就是DaggerKettleComponent了。

写一个測试类,測试一下注入的结果:

src/main/Test:

public class Test {
public static void main(String[] args) {
KettleComponent component = DaggerKettleComponent.builder().build();
Kettle kettle = component.providesKettle();
kettle.on();
kettle.brew();
kettle.off();
}
}

这里一定要注意,DaggerKettleComponent类是Daager2依据注解自己主动生成的一个类。我们能够看一下这个类的源代码。就知道为什么要这么调用才干生成一个KettleComponent对象了。

@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerKettleComponent implements KettleComponent {
private Provider<Heater> providesHeaterProvider;
private Provider<Kettle> providesKettleProvider; private DaggerKettleComponent(Builder builder) {
assert builder != null;
initialize(builder);
} public static Builder builder() {
return new Builder();
} public static KettleComponent create() {
return builder().build();
} private void initialize(final Builder builder) {
this.providesHeaterProvider = ScopedProvider.create(KettleModule_ProvidesHeaterFactory.create(builder.kettleModule));
this.providesKettleProvider = ScopedProvider.create(KettleModule_ProvidesKettleFactory.create(builder.kettleModule, providesHeaterProvider));
} @Override
public Kettle providesKettle() {
return providesKettleProvider.get();
} public static final class Builder {
private KettleModule kettleModule; private Builder() {
} public KettleComponent build() {
if (kettleModule == null) {
this.kettleModule = new KettleModule();
}
return new DaggerKettleComponent(this);
} public Builder kettleModule(KettleModule kettleModule) {
if (kettleModule == null) {
throw new NullPointerException("kettleModule");
}
this.kettleModule = kettleModule;
return this;
}
}
}

DaggerKettleComponent实现了KettleCommpoment接口,并重写了providesKettle方法。

首先调用静态方法builder是为了创建静态内部类Builder类的对象,创建对象后调用方法kettleModule方法为Builder的kettleModule属性赋值,随后再调用静态内部类Builder对象的build方法创建DaggerKettleComponent的对象。

在DaggerKettleComponent构造器中会首先对静态内部类Builder对象进行一下判空,然后调用initialize(builder)方法,利用这个静态内部类Builder对象为自己的两个属性赋值:providesHeaterProvider属性和providesKettleProvider属性。而且providesKettleProvider属性值的创建要依赖于providesHeaterProvider属性值。随着providesHeaterProvider属性和providesKettleProvider属性初始化完成,DaggerKettleComponent对象也就创建完成了。

当调用providesKettle方法的时候。返回的是providesKettleProvider的get方法的返回值。

最后測试程序的运行结果为:

使用Dagger2创建的第一个小样例的更多相关文章

  1. Robotframework(2):创建RF第一条可执行的用例

    转载:http://www.cnblogs.com/CCGGAAG/p/7800323.html 上篇,我们说了如何配置基础的环境,配置好了python2.wxPython .robot framew ...

  2. SpringMVC+Spring+Hibernate的小样例

    Strusts2+Spring+Hibernate尽管是主流的WEB开发框架,可是SpringMVC有越来越多的人使用了.确实也很好用.用得爽! 这里实现了一个SpringMVC+Spring+Hib ...

  3. Android开发之 Windows环境下通过Eclipse创建的第一个安卓应用程序(图文详细步骤)

    第一篇  windows环境下搭建创建的第一个安卓应用程序 为了方便,我这里只采用了一体包进行演示. 一.下载安卓环境的一体包. 官网下载:安卓官网(一般被墙了) 网盘下载: http://yunpa ...

  4. Spring DI模式 小样例

           今儿跟同事讨论起来spring早期的,通过大篇幅xml的配置演变到今天annotation的过程,然后随手写了个小样例,感觉还不错,贴到这里留个纪念. 样例就是用JAVA API的方式, ...

  5. 简单的ADO.NET连接数据小样例

    ADO.NET连接数据库的样例如下: using System; using System.Collections.Generic; using System.ComponentModel; usin ...

  6. Robot Framework自动化测试(二)第一个用例

    RIDE启动界面: 首先创建一个Test project File-New Project ,选择Directory类型 在创建的文件夹上右键,创建一个Test Suite Openbaidu, NE ...

  7. Java 小样例:图书馆课程设计(Java 8 版)

    用 Java 模拟一个图书馆.包含创建图书.创建读者.借书.还书.列出全部图书.列出全部读者.列出已借出的图书.列出过期未还的图书等功能. 每一个读者最多仅仅能借 3 本书,每一个书最多仅仅能借 3 ...

  8. php单例模式实现对象只被创建一次 mysql单例操作类

    这是我在php面试题中遇到的一道试题,单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费. ...

  9. 决策树python实现小样例

    我们经常使用决策树处理分类问题,近年来的调查表明决策树也是经常使用的数据挖掘算法K-NN可以完成多分类任务,但是它最大的缺点是无法给出数据的内在含义,决策树的主要优势在于数据形式非常容易理解决策树的优 ...

随机推荐

  1. 24岁菜鸟,能一个人撑起App开发吗

     "疲惫吾心.怎样躲藏.四处荒芜,怎话忧伤?"临近中秋,看到艾瑞斯的QQ签名,无尽的伤感.这个年仅24的青年.连续3年没有回家了,近期一个月总是失眠,没有家人的陪伴,就连女朋友 ...

  2. 【Cocos2d-x】坐标系和图层

    在Cocos2D-X中,存在四种坐标系: 1.OpenGL坐标系:该坐标系原点在屏幕左下角.x轴向右,y轴向上.这也就是cocos2dx中用到的坐标系所以没啥好说的. 2.屏幕坐标系(UIKit坐标) ...

  3. 解决ORA-02395:超出I/O使用的调用限制问题

    ORACLE的PROFILE文件是限制数据库用户使用的资源的一种手段.如:控制session或sql能使用的CPU.控制用户的password管理策略等. 数据库创建后,系统则存在名为DEFAULT的 ...

  4. UVA 11000- Bee 递推

    In Africa there is a very special species of bee. Every year, the female bees of such species give b ...

  5. UVA 11728 - Alternate Task 数学

    Little Hasan loves to play number games with his friends. One day they were playing a game whereone ...

  6. uninstall OpenJDK9

    sudo apt--jre openjdk--jdk ///要慎用auto命令,会把所有的软件包删掉 https://www.linuxidc.com/Linux/2017-11/148941.htm ...

  7. 一个操作oracle的c#类 含分页

    有别于以前的一个OracleHelper,这个版各有所长,MARK下. using System; using System.Data; using System.Data.OracleClient; ...

  8. 解决 Eclipse 导入项目后 Maven Dependencies missing jar 问题

    转自:https://yq.aliyun.com/ziliao/314086 话不多说直接上图 上图是我通过git导入项目后, Maven Dependencies Library中很多包出现miss ...

  9. ValueProvider核心的值提供系统

    Model绑定的数据具有多种来源: 提交的表单 Json字符串 当前路由数据 请求地址的查询字符串 ASP.NET MVC将这种基于不同数据来源的数据提供机制实现在ValueProvider的组件中 ...

  10. asp访问数据库原理以及代码

    ActiveX Data Objects (ADO) 是一项容易使用并且可扩展的将数据库访问添加到 Web 页的技术.可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Co ...