引言
通过前面的(http://blog.csdn.net/xuewend/article/details/73511128)文章,知道了注解的作用,其中一种就是做依赖注入,dagger是依赖注入的一种框架,那么如何来使用dagger框架呢?
Android Studio中的配置
top build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
//添加apt插件
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
app build.gradle
//添加apt注解插件
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
testCompile 'junit:junit:4.12'
//添加dagger依赖的库,当前版本为2.4
compile 'com.google.dagger:dagger:2.4'
apt 'com.google.dagger:dagger-compiler:2.4'
}
实例
package com.example.fishmov.daggerdemo;
import javax.inject.Inject;
/**
* Created by fishmov on 17-6-21.
*/
public class People {
private String name = "";
@Inject
public People() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.example.fishmov.daggerdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import javax.inject.Inject;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "fish---";
@Inject
People people;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate: " + people);
}
}
直接运行,结果为:
06-21 15:35:36.818 26506-26506/com.example.fishmov.daggerdemo I/fish—: onCreate: null
因为我们目前的@Inject只是一个注解,并没有解析器来解析它,所以加不加一样,people没有初始化当然为空.
我们的目的是通过dagger框架在MainActivity自动注入依赖的People实例,要实现这个还需要一个桥梁Componet,通过Componet来注入:
package com.example.fishmov.daggerdemo;
import dagger.Component;
/**
* Created by fishmov on 17-6-21.
*/
@Component
public interface MainComponet {
//定义注入的方法,表示支持对某个类的注入
void inject(MainActivity activity);
}
记得rebuild一下,将自动生成Dagger+MainComponet一个类.
package com.example.fishmov.daggerdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import javax.inject.Inject;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "fish---";
@Inject
People people;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate: " + people);
DaggerMainComponet.builder().build().inject(this);
Log.i(TAG, "onCreate: " + people);
}
}
直接运行,结果为:
com.example.fishmov.daggerdemo I/fish—: onCreate: null
com.example.fishmov.daggerdemo I/fish—: onCreate: com.example.fishmov.daggerdemo.People@9af3aad
可以看到,调用dagger注入后,people实例化了一个对象.这种注入方式是最基本的注入方式,
然而这并没有什么卵用.
通过这种方式注入,需要在类的构造方法中添加@Inject注解,有时候我们无法修改别人的构造方法的时候,要如何使用注入呢?这个时候就需要@Module和@Provides注解了.
实例
package com.example.fishmov.daggerdemo;
import javax.inject.Inject;
/**
* Created by fishmov on 17-6-21.
*/
public class People {