听说Dagger2 很长一段时间了 每次都是点开一个教程 看看别人的实现 但是每每读起来确实晦涩难懂 终于这两天又时间了 自己尝试着写一个简单的例子 我将以一个初学者的角度记录下 我的simple Dagger2
在我写Dagger2 例子之前 我看了很多篇文章 但是我看完后 无非记住了几个名字 比如 反转控制 依赖注入 等 对于涉及模式我不太懂 所以这个反转控制这个名词我也就云里雾里了 依赖注入 这是个什么东西?
还好我这个人不喜欢究理 对于不理解的东西 都是抱着先用后理解 就像依葫芦画瓢 这样用着用着 就发现他的道理了。或许这也是一个不错的方式。
我先给出Dagger2里的核心的几个需要实现的需要我们实现的类 这就是依葫芦画瓢的原始版本
XXModule 创造东西的机床 或者机器 也可以说是装对象的容器 XX名字有你定义 比如 本例子中的StudentModule
XX 机床或机器创造出来的东西 比如本例中的 Pen class
XXComponent 在写本片文章的时候我百度了下Component这个单词的意思
意为:n. 成分; 组分; 零件; [数] 要素;
adj. 成分的; 组成的; 合成的; 构成的;
[例句]Enriched uranium is a key component of a nuclear weapon
浓缩铀是核武器的关键组成部分。
结合上面的 XXModule,pen来看 XXComponent 对于学生去拿笔的这件事情来说 就相当于 把人和笔组装在了一个 这样不就意味着学生拿到笔了 换句话说 这个 XXComponent 把笔塞到了学生的手中 所以每当我们想拿笔的时候 我们不需要知道怎么制造这支笔 我们只管向 组装机(XXComponent)去要就行了 假如不用Dagger2 我们试想下实现方式
public class Student {
private String studentName;
private Pen pen;
public Student(String name) {
this.studentName = name;
this.pen = new Pen("red");
}
}
如果哪天 我改变了 Pen这个构造方法 增加了一个笔的类型 如 圆珠笔 毛笔 水彩笔 是不是所有new Pen的地方都需要去改 感觉麻烦不?
那现在我来说说我理解的 Dagger2是个什么东西吧。我先举个例子 比如 每个学生都有一支笔 假如他想用这支笔 那么他怎么能拿到这只笔呢? 他会从文具盒里去拿 别告诉我万一文具盒里没有笔。那么以一个程序员的角度来说就是 文具盒给学生提供了一支笔 可以想象 文具盒(XXModule)相当于一个机器 他能制造出各种笔来 也可以说是装对象的容器(当然笔肯定不是文具盒制造的 不过此次你可以想象成是) 通过去拿(XXComponent)这个动作 获得一支笔(Pen)
上面说了很大一段废话 只是为了说出我理解的Dagger2
下面从代码的角度来呈现
配置环境
工程的 build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
maven { url 'https://dl.bintray.com/lhj/maven/'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
你需要添加 预编译
classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ 这句
app 的 build.gradle
apply plugin: ‘com.android.application’
apply plugin: ‘com.neenbedankt.android-apt’
apply plugin: ‘com.neenbedankt.android-apt’ 添加这句(预编译插件)
然后添加 Dagger2的compile
compile ‘com.google.dagger:dagger:2.5’
compile ‘com.google.dagger:dagger-compiler:2.5’
我的app 的build.gradle的完整代码
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android {
compileSdkVersion 24
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.example.admin.learndrager2"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// 注释冲突
packagingOptions {
exclude 'META-INF/services/javax.annotation.processing.Processor'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
provided 'org.glassfish:javax.annotation:10.0-b28'
compile 'com.google.dagger:dagger:2.5'
compile 'com.google.dagger:dagger-compiler:2.5'
compile 'com.lhj:mvpbase:1.2'
}
万事俱备只差代码的实现了
根据上面说到的 要实现Dagger2我至少需要定义3个类 XXComponent XX类 XXModule 那我们应该毫不犹豫的去创建出这三个类 我已经创建好了 分别为 StudentComponent,StudentModule,Pen 我直接给出代码 已经在代码中解释了
Pen
/**
* Created by admin on 2016/9/8.
*/
public class Pen {
private String penColor = "红色";// 默认红色的一支笔
@Inject // 表明 Pen 这个对象可以由 机器创造出来 并且可以由组装机组装给学生 Inject 英文为注入的意思此处 可以说 组装机可以把这支笔 注入到学生手中
public Pen(String penColor) {
this.penColor = penColor;
}
public String getPenColor() {
return penColor;
}
}
StudentModule
/**
* Created by admin on 2016/9/8.
*/
@Module // 表明他是一个机器 他能生产创造出 东西来 你想创造的任何东西都可以友它来创造实现 比如此处我要生成出一支红色的笔 生产出的笔 可以提供给学生使用
public class StudentModule {
@Provides // 次标注表明 可以提供给外部使用 此处意为 可以提供给学生使用
Pen providePen() { // 固定格式 provide + class对象 如此处的Pen 所以变成方法名 providePen
return new Pen("红色");
}
}
StudentComponent 注意此类 为interface 接口 不为class
/**
* Created by admin on 2016/9/8.
*/
@Component(modules = StudentModule.class) // 组装机的一头连接向 生产笔的机器 StudentModule(产生笔的机器)
public interface StudentComponent {
void inject(StudentActivity studentActivity); // 组装机的另一头连接到了学生 【学生-组装机-生产笔的机器】
}
上面的两个类编写好后 注意你此时得 选择as上的build工具栏下的 make Project功能 make一下工厂 不然无法在下面的StudentActivity使用DaggerStudentComponent这份类 make Project后他会自动帮你产生这个DaggerStudentComponent类
StudentActivity 学生
public class StudentActivity extends AppCompatActivity {
@Inject // 通过此 直接拿到机器帮你生产的产品 只要你自己的产品的构造方法标注此注解 并且也在生产机器中注册好了
Pen pen;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_student);
// DaggerStudentComponent 其实这才是 真正的组装机 连接到 生产机器 studentModule(new StudentModule()) 再连接到学生 inject(this) this 就是StudentActivity (学生)
DaggerStudentComponent.builder().studentModule(new StudentModule()).build().inject(this);
//好了 我们可以直接使用这支笔了 应为这支笔已经有 生成机器生产出来了 默认为红色的 我们toast 一下
Toast.makeText(StudentActivity.this, pen.getPenColor(), Toast.LENGTH_SHORT).show();
//接下来就是看你的表演了 定义更多的产品(class 对象) 让生产机器帮你生产(StudentModule 注意格式)
}
}
代码非常少 主要定义好三个类 依葫芦画瓢就行 当然这只是一个组装机 你可以定义多个组装机 多个车床机器 那就看你自己的实现了
有不对地方请大家指出 此处仅仅是我个人的理解与看法。