第一步:配置
1.
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
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
}
apply plugin: 'com.neenbedankt.android-apt'
2.
apply plugin: 'com.neenbedankt.android-apt'
3.
//Required by Dagger2
apt 'com.google.dagger:dagger-compiler:2.0.2'
compile 'com.google.dagger:dagger:2.0.2'
// Dagger 2 中会用到 @Generated 注解,而 Android SDK 中没有 javax.anotation.Generated.class,所以在 Android 项目要添加此句
provided 'org.glassfish:javax.annotation:10.0-b28'
第二步:demo
1.创建要注入的类
public class AClass {
public String name;
@Inject
public AClass(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class BClass {
public String name;
@Inject
public BClass(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.创建Module
@Module
public class Model {
private String name;
public Model(String name) {
this.name = name;
}
@Provides
public AClass provideAClass(){
return new AClass(name);
}
/*参数必须得提供,否则生成不了dagger+component*/
@Provides
public BClass provideBClass(String name){
return new BClass(name);
}
/*提供B类的字符串,在同一类中,provideBClass默认会自动寻找需要的返回类型,故不能重复*/
@Provides
public String provideString(){
return "B";
}
3.构造Component,负责注入
@Component(modules = Model.class)
public interface MyComponent {
void inject(MainActivity activity);
}
4.进行注入
public class MainActivity extends AppCompatActivity {
@Inject
AClass aClass;
@Inject
BClass bClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*注入到activity中*/
DaggerMyComponent.builder().model(new Model("A")).build().inject(this);
Log.e("yan", aClass.getName()+","+bClass.getName());
}
}
注:如果找不到DaggerMyComponent,请编译下项目。
打印: A,B
OK,最简单的一套流程已经走完,下面进行简单的拓展。
1.关于@Qualifier限定符的使用
@Qualifier:限定符,当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解来区分。例如:在 Android 中,我们会需要不同类型的 Context,所以我们可以定义 @Qualifier 注解 @ForApplication 和 @ForActivity,这样当注入一个 Context 的时候,我们就可以告诉 Dagger 我们想要哪种类型的 Context。
下面列举一个其他的示例(初入研究,如有问题,请指正)
需求分析:倘若我要在Model中
@Provides
public BClass provideBClass(String name){
return new BClass(name);
}
@Provides
public String provideString(){
return "B";
}
不止一个这样的提供,还有可能加上下面的
@Provides
public AClass provideAClass(String name){
return new AClass(name);
}
@Provides
public String provideString(){
return "A";
}
这样就会报错了,提示provideString已经定义过,那么我们可以通过引入自定义@Qualifier来解决这种冲突。
1.首先定义操作符
@Qualifier
public @interface StringQuali {
String value() default "";
}
2.
@Provides
public AClass provideQualiAClass(@StringQuali("a") String name) {
return new AClass(name);
}
//参数必须得提供,否则生成不了dagger+component
@Provides
public BClass provideQualiBClass(@StringQuali("b") String name) {
return new BClass(name);
}
@Provides
@StringQuali("a")
public String provideAString() {
return "小红A";
}
//提供B类的字符串,在同一类中,provideBClass默认会自动寻找需要的返回类型,故不能重复
@Provides
@StringQuali("b")
public String provideBString() {
return "小红B";
}
本期就介绍那么多,还有一些操作符,以后遇到再总结。
附 源码地址