设为首页 加入收藏

TOP

浅析Dagger2的使用(一)
2017-10-13 10:35:48 】 浏览:7833
Tags:浅析 Dagger2 使用

什么是Dagger2

Dagger是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护,现在由Google维护。

 

我们知道Dagger是一个依赖注入的框架,那么什么是依赖注入呢?

我们在activity中有可能会用到很多很多的类,这些类要在activity中进行实例化,这样就导致我们的activity非常依赖这么多的类,这样的程序耦合非常

严重,不便于维护和扩展,有什么办法可以不去依赖这些类呢,这时候就需要有一个容器(IoC),将这些类放到这个容器里并实例化,我们activity在用

到的时候去容器里面取就可以了,我们从依赖类到依赖这个容器,实现了解耦,这就是我所理解的依赖注入,即所谓控制反转;

 

简单的说 Dagger就是用来创造这个容器,所有需要被依赖的对象在Dagger的容器中实例化,并通过Dagger注入到合适的地方,实现解耦,MVP框架就是为解耦而生,因此MVP和Dagger是绝配;

 

举个栗子?

通常情况下我们引用一个类的做法:

我们先定义一个简单的类:

 1 public class User {
 2     private String name;
 3 
 4     public String getName() {
 5         return name;
 6     }
 7 
 8     public void setName(String name) {
 9         this.name = name;
10     }
11 }

在Activity中对其操作

1 private void initData() {
2 
3         User user = new User();
4 
5         user.setName("测试");
6     }

以上是最普通的用法

接下来我们来看Dagger2的用法

我们先来配置一下Dagger2

首先在项目的 build.gradle:

 

1 dependencies {
2         classpath 'com.android.tools.build:gradle:1.5.0'
3         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
4         classpath 'me.tatarka:gradle-retrolambda:3.2.0'
5         // NOTE: Do not place your application dependencies here; they belong
6         // in the individual module build.gradle files
7     }

 

 

 

然后是APP的 build.gradle

 1 apply plugin: 'com.android.application'
 2 apply plugin: 'com.neenbedankt.android-apt'
 3 apply plugin: 'me.tatarka.retrolambda'
 4 android {
 5     compileSdkVersion 23
 6     buildToolsVersion "23.0.1"
 7 
 8     defaultConfig {
 9         applicationId "jiao.com.jiaoproject"
10         minSdkVersion 15
11         targetSdkVersion 23
12         versionCode 1
13         versionName "1.0"
14     }
15     buildTypes {
16         release {
17             minifyEnabled false
18             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
19         }
20     }
21 
22     compileOptions {
23         sourceCompatibility JavaVersion.VERSION_1_8
24     }
25 
26 }
27 
28 dependencies {
29     compile fileTree(dir: 'libs', include: ['*.jar'])
30     testCompile 'junit:junit:4.12'
31     compile 'com.android.support:appcompat-v7:23.3.0'
32     compile 'com.android.support:design:23.3.0'
33     apt 'com.google.dagger:dagger-compiler:2.2'
34     provided 'org.glassfish:javax.annotation:10.0-b28'
35     compile 'com.google.dagger:dagger:2.2'
36     compile 'com.jakewharton:butterknife:7.0.1'
37     compile 'com.squareup.okhttp3:logging-interceptor:3.3.0'
38 }

 

首先

 1 public class User {
 2     private String name;
 3 
 4     @Inject
 5     public User() {
 6     }
 7 
 8     public String getName() {
 9         return name;
10     }
11 
12     public void setName(String name) {
13         this.name = name;
14     }
15 }

发现有什么变化了没?@Inject是什么东东?待会我们来说;

接着我们看怎么使用

1     @Inject
2     User user;
3 
4     private void initData() {
5 
6         user.setName("测试");
7     }

这时候我们允许程序发现空指针了;因为还缺少一个东西;

1 @Component
2 public interface ActivityComponent {
3 
4     void inject(MainActivity MainActivity);
5 }

加上这个类之后 并且在Activity中对其初始化 完整代码如下:

1  @Inject
2     User user;
3 
4     private void initData() {
5         DaggerActivityComponent.builder().build().inject(this);
6         user.setName("测试");
7     }

这时候发现我们的user对象可以正常使用了;看上去感觉挺复杂的,但是对于大型项目引用的类过多的时候,Dagger的优势就体现出来了;

接下来我一一解答你们的疑惑;

首先我们来了解这几个基础概念:

  • @Inject Inject主要有两个作用,一个是使用在构造函数上,通过标记构造函数让Dagger2来使用(Dagger2通过Inject标记可以在需要这个类实 例的时候来找到这个构造函数并把相关实例
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android开发学习之路-DiffUtil使.. 下一篇ListFragment的使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目