使用Dagger2创建的第一个小样例
将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创建的第一个小样例的更多相关文章
- Robotframework(2):创建RF第一条可执行的用例
转载:http://www.cnblogs.com/CCGGAAG/p/7800323.html 上篇,我们说了如何配置基础的环境,配置好了python2.wxPython .robot framew ...
- SpringMVC+Spring+Hibernate的小样例
Strusts2+Spring+Hibernate尽管是主流的WEB开发框架,可是SpringMVC有越来越多的人使用了.确实也很好用.用得爽! 这里实现了一个SpringMVC+Spring+Hib ...
- Android开发之 Windows环境下通过Eclipse创建的第一个安卓应用程序(图文详细步骤)
第一篇 windows环境下搭建创建的第一个安卓应用程序 为了方便,我这里只采用了一体包进行演示. 一.下载安卓环境的一体包. 官网下载:安卓官网(一般被墙了) 网盘下载: http://yunpa ...
- Spring DI模式 小样例
今儿跟同事讨论起来spring早期的,通过大篇幅xml的配置演变到今天annotation的过程,然后随手写了个小样例,感觉还不错,贴到这里留个纪念. 样例就是用JAVA API的方式, ...
- 简单的ADO.NET连接数据小样例
ADO.NET连接数据库的样例如下: using System; using System.Collections.Generic; using System.ComponentModel; usin ...
- Robot Framework自动化测试(二)第一个用例
RIDE启动界面: 首先创建一个Test project File-New Project ,选择Directory类型 在创建的文件夹上右键,创建一个Test Suite Openbaidu, NE ...
- Java 小样例:图书馆课程设计(Java 8 版)
用 Java 模拟一个图书馆.包含创建图书.创建读者.借书.还书.列出全部图书.列出全部读者.列出已借出的图书.列出过期未还的图书等功能. 每一个读者最多仅仅能借 3 本书,每一个书最多仅仅能借 3 ...
- php单例模式实现对象只被创建一次 mysql单例操作类
这是我在php面试题中遇到的一道试题,单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费. ...
- 决策树python实现小样例
我们经常使用决策树处理分类问题,近年来的调查表明决策树也是经常使用的数据挖掘算法K-NN可以完成多分类任务,但是它最大的缺点是无法给出数据的内在含义,决策树的主要优势在于数据形式非常容易理解决策树的优 ...
随机推荐
- 24岁菜鸟,能一个人撑起App开发吗
"疲惫吾心.怎样躲藏.四处荒芜,怎话忧伤?"临近中秋,看到艾瑞斯的QQ签名,无尽的伤感.这个年仅24的青年.连续3年没有回家了,近期一个月总是失眠,没有家人的陪伴,就连女朋友 ...
- 【Cocos2d-x】坐标系和图层
在Cocos2D-X中,存在四种坐标系: 1.OpenGL坐标系:该坐标系原点在屏幕左下角.x轴向右,y轴向上.这也就是cocos2dx中用到的坐标系所以没啥好说的. 2.屏幕坐标系(UIKit坐标) ...
- 解决ORA-02395:超出I/O使用的调用限制问题
ORACLE的PROFILE文件是限制数据库用户使用的资源的一种手段.如:控制session或sql能使用的CPU.控制用户的password管理策略等. 数据库创建后,系统则存在名为DEFAULT的 ...
- UVA 11000- Bee 递推
In Africa there is a very special species of bee. Every year, the female bees of such species give b ...
- UVA 11728 - Alternate Task 数学
Little Hasan loves to play number games with his friends. One day they were playing a game whereone ...
- uninstall OpenJDK9
sudo apt--jre openjdk--jdk ///要慎用auto命令,会把所有的软件包删掉 https://www.linuxidc.com/Linux/2017-11/148941.htm ...
- 一个操作oracle的c#类 含分页
有别于以前的一个OracleHelper,这个版各有所长,MARK下. using System; using System.Data; using System.Data.OracleClient; ...
- 解决 Eclipse 导入项目后 Maven Dependencies missing jar 问题
转自:https://yq.aliyun.com/ziliao/314086 话不多说直接上图 上图是我通过git导入项目后, Maven Dependencies Library中很多包出现miss ...
- ValueProvider核心的值提供系统
Model绑定的数据具有多种来源: 提交的表单 Json字符串 当前路由数据 请求地址的查询字符串 ASP.NET MVC将这种基于不同数据来源的数据提供机制实现在ValueProvider的组件中 ...
- asp访问数据库原理以及代码
ActiveX Data Objects (ADO) 是一项容易使用并且可扩展的将数据库访问添加到 Web 页的技术.可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Co ...