Dagger2----一个最简单的Dagger2依赖的实现
Dagger2是首个使用生成代码实现完整依赖注入的框架,极大降低了使用者的编码负担。Dagger2分析全部依赖并生成代码将这些依赖组织在一起,关于很多其它的Dagger2理论介绍请移步具体解释Dagger2(中文版)Tasting Dagger 2 on Android(可能须要梯子)。
本次我们主要介绍怎样完毕一个最简单的Dagger2依赖项目,当中包含dagger2的Gradle加入和最基本注入关系处理。首先介绍注解的几个概念:
- @Inject: 通常在须要依赖的地方使用这个注解。换句话说。你用它告诉Dagger这个类或者字段须要依赖注入。这样。Dagger就会构造一个这个类的实例并满足他们的依赖
- @Module: Modules类里面的方法专门提供依赖,所以我们定义一个类。用@Module注解。这样Dagger在构造类的实例的时候,就知道从哪里去找到须要的 依赖。
modules的一个重要特征是它们设计为分区并组合在一起(比方说。在我们的app中能够有多个组成在一起的modules)。
- @Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
- @Component: Components从根本上来说就是一个注入器。也能够说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components能够提供全部定义了的类型的实例。比方:我们必须用@Component注解一个接口然后列出全部的@Modules组成该组件,如 果缺失了不论什么一块都会在编译的时候报错。
全部的组件都能够通过它的modules知道依赖的范围。
接下来就让我们进入代码部分吧,首先新建项目,在Project的build.gradle里面加入apt classpath例如以下:
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
在app 的build.gradle文件中面加入Dagger2依赖,例如以下所看到的:
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android {
compileSdkVersion 23
buildToolsVersion "24.0.0 rc2"
defaultConfig {
applicationId "com.tt.simpledagger2demo"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
apt 'com.google.dagger:dagger-compiler:2.2'
compile 'com.google.dagger:dagger:2.2'
provided 'javax.annotation:jsr250-api:1.0'
compile 'com.jakewharton:butterknife:7.0.1'
}
注意apply plugin: 'com.neenbedankt.android-apt'这一句,不要忘了喔。
完毕以上步骤就完毕了Dagger2的gradle依赖。
编译一下不报错那就go on吧。
新建UserModel实体类。我们在实体类内部模拟数据的生成就好(PS,为了简单),代码例如以下:
public class UserModel {
private String userName = "123";
private String userPass = "456";
private String address;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPass() {
return userPass;
}
public void setUserPass(String userPass) {
this.userPass = userPass;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public UserModel() {
}
public UserModel(String userName, String userPass, String address) {
this.userName = userName;
this.userPass = userPass;
this.address = address;
}
}
完毕数据层实体部分的编写。接下来我们就要把数据注入到MainActivity中。新建ActivityModule:
@Module
public class ActivityModule {
@Provides
UserModel provideUserModel() {
return new UserModel();
}
}
如上使用@Module标识我们ActivityModule类提供依赖。接着我们使用@Component标识注入:
@Component(modules = ActivityModule.class)
public interface ActivityComponent {
void inject(MainActivity mainActivity);
}
在MainActivity中,初始化Dagger2注入:
@Bind(R.id.textview)
TextView mTextview;
private ActivityComponent mActivityComponent;
@Inject
UserModel userModel;
在onCreate函数中改动例如以下:
mActivityComponent = DaggerActivityComponent.builder().activityModule(new ActivityModule()).build();
mActivityComponent.inject(this);
mTextview.setText(userModel.getUserName()+"----"+userModel.getUserPass());
小伙伴们。是不是突然感觉脸要绿了,为啥呢?好像是DaggerActivityComponent这个东东不存在唉,是不是哪里错了啊?
哈哈。事实上并没有。前面也说了Dagger2是首个使用生成代码实现完整依赖注入的框架。所以这样的依赖类仅仅有rebuild以后才干有喔。赶紧rebuild一下点绿色三角运行一下,我的运行结果例如以下:
完整源代码:完整源代码
參考:Dependency Injection with Dagger 2
使用Dagger 2进行依赖注入
Dagger2----一个最简单的Dagger2依赖的实现的更多相关文章
- Linux下一个最简单的不依赖第三库的的C程序(1)
如下代码是一段汇编代码,虽然标题中使用了C语言这个词语,但下面确实是一段汇编代码,弄清楚了这个代码,后续的知识点才会展开. simple_asm.s: #PURPOSE: Simple program ...
- Linux下一个最简单的不依赖第三库的的C程序(2)
一个最简单的C程序,如下: main.c: int main() { char *str = "Hello World"; ; } 在64位平台上编译一个32位的程序,如下:(32 ...
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...
- 【最简单IOC容器实现】实现一个最简单的IOC容器
前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...
- [编译] 1、第一个makefile简单例子
前言 本篇用一个最简单的例子引入makefile,教你编写第一个makefile 正文 在Download/aa文件夹下有a.c和makefile文件 litao@litao:~/Downloads/ ...
- Skinned Mesh原理解析和一个最简单的实现示例
Skinned Mesh 原理解析和一个最简单的实现示例 作者:n5 Email: happyfirecn##yahoo.com.cn Blog: http://blog.csdn.net/n5 ...
- 简述一个javascript简单继承工具的实现原理
背景 由于本人非常希望能够开发自己的游戏,所以业余时间一直在想着能不能自己一些好玩又有趣的东西出来,最近随着steam上众多独立游戏的爆发,感觉自己又燃烧了起来,所以又拾起了很久以前的一个2d引擎,决 ...
- Epii.js 一个极其简单的Js模板引擎
Epii.js 简约而不简单的Js模板引擎 Epii.js 简约而不简单的JavaScript模板引擎 # 特性 一个轻量级模板引擎,可快速实现数据与ui绑定(数据变动,UI自动变动),快速实现事件绑 ...
- 一个极为简单的方法实现本地(离线)yum安装rpm包
首先,我要关心的问题仍然是如何离线或者本地yum安装rpm包?这其中的关键当然是获取rpm包到本地,这其中的麻烦事是去解析依赖关系.然而,我发现一个极为简单的方法可以不用操心rpm包依赖关系,不多不少 ...
随机推荐
- Sublime Text3 学习笔记
注:以下记录自己的 Sublime Text3学习过程(持续更新中) 目录: 安装 下载文件 破解试用 插件安装 安装 Sublime Text 是一套跨平台的文本编辑器,支持基于Python的插件. ...
- jq进度条
<!doctype html><html><head><meta charset="utf-8"><title>JQue ...
- jq ajax请求error: Maximum call stack size exceeded
原因是data中参数iconUrl这个变量未声明导致的.jq在内部循环时报错
- JavaScript中数据类型的转换规则
JavaScript中数据类型的转换规则 制作人:全心全意 JavaScript是一种无类型语言,也就是说,在声明变量时无须指定数据类型,这使得JavaScript更具有灵活性和简单性. 在代码执行过 ...
- 闲着无聊 一个python的,三级菜单。装逼版。
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': ...
- json pickle shelve hashlib collections time
import json # Json模块提供了四个功能:dumps.dump.loads.load dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = js ...
- 集训第五周动态规划 D题 LCS
Description In a few months the European Currency Union will become a reality. However, to join the ...
- (转载)O(N)的素数筛选法和欧拉函数
转自:http://blog.csdn.net/dream_you_to_life/article/details/43883367 作者:Sky丶Memory 1.一个数是否为质数的判定. 质数,只 ...
- os系统下安装Python2和Python3
一.下载Xcode工具 1.在App Store 里面下载并安装Xcode 2.安装好Xcode后就打开它,首次进入会有一些LicenceAgreement,点同意就是了,然后就进入到 这个界面: 3 ...
- windows系统安装虚拟机VMware12,然后在虚拟机中安装Red Hat Enterprise Linux6操作系统
准备工作下载百度网盘: https://www.baidu.com/s?wd=%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98&rsv_spt=1&rsv_iq ...