前言
Dagger2官方定义是这样的:
A fast dependency injector for Android and Java.
一个Android和Java的快速依赖注解器。为什么说是快速呢?举个例子,另一个著名的注解框架——ButterKnife是通过Java Annotation Processing技术,就是在Java代码编译成Java字节码的时候就已经处理了 ;Dagger2也是一样,通过apt插件在编译阶段生成注入代码的,也就是说反射只是在编译阶段使用了,而在应用运行的时候其实运行的是真正的Java代码并没有涉及到注解反射。因此是快速注解。
另外,Dagger2通过apt生成的文件在build/generated/source/apt/debug/工程路径 下,后面将会结合这些文件了解Dagger2的流程。
Dagger2的使用场景:现在大多应用于MVP架构中,作用就是解耦;其次就是基本的依赖注入的功能。
小白学习之我见
个人评价:不是那么好上手……感觉看一遍源码了解了这些步骤才能很好的使用,总之,看一遍源码了解下流程对使用Dagger2有很大帮助。(对我这种没有用dagger,而直接学dagger2的人来说),另外,貌似很多人还将其跟ButterKnife一起用。ButterKnife用于注解View、其他部分用dagger2。有兴趣的可以试下。
顺便提一篇博客,写的非常不错,感觉讲的蛮清晰的:Android单排上王者系列之Dagger2使用解析
还有一点:注解加上去之后要编译一遍,这样才能生成一Dagger开头的文件,否则你再Activity中使用DaggerXXXComponent.builder().xxxModule(new XxxModule(this)).build().inject(this)
是会找不到DaggerXXXComponent的,DaggerXXXComponent这些都是自动生成的(AS编译快捷键ctrl+f9)
Dagger2的使用
Dagger2的导入
1. 添加apt
首先在工程根目录下的build.gradle中修改dependencies,加入
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'//当前最新版本是1.8,可以按需求改
完整代码
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
// 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'
}
2.添加依赖
在build.gradle中加入
apply plugin: 'com.neenbedankt.android-apt'
compile 'com.google.dagger:dagger:2.8'
apt 'com.google.dagger:dagger-compiler:2.8'
完整代码:
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'//将apt启动
android {
……………………
}
dependencies {
……
compile 'com.google.dagger:dagger:2.8'
apt 'com.google.dagger:dagger-compiler:2.8'
……
}
Dagger2的使用流程
以MVP为例,简单来说,就是:
- presenter中使用@Inject注解其构造器
- 在View层使用@Inject注解presenter
- 新建一个Module,一个Component
- 然后在view层中加入
DaggerXXXComponent.builder().xxxModule(new XxxModule(this)).build().inject(this);
简单来说就是这样,下面就以代码为例,介绍下dagger2的详细用法
结合源码,详解Dagger的使用
恩,这部分结构有点乱,不过完全按照我学习过程中是怎么考虑的来的,如果想直接看归纳整理,可以跳转到总结部分
presenter
在presenter构造器处使用@Inject。
public class LoginPresenterCompl implements ILoginPresenter {
private ILoginView loginView ;
private User user ;
//注意此处使用了注解
@Inject
public LoginPresenterCompl(ILoginView view){
loginView = view ;
user = new User("张三","123456") ;
}
......
}
使用@Inject注解之后,编译生成一个LoginPresenterCompl_Factory文件,代码如下:
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://google.github.io/dagger"
)
public final