Dagger2 依赖注入(Dependency injection ),通过注解的形式引入实体类,然后再接口Component作为桥梁沟通Moudle构建工厂模式注入到Activity/Fragment中减少我们new 实体化繁琐操作和统一管理我们的实列化对象
Gradle 引入 Dagger2
主目录gradle.build
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
项目gradle.build
dependencies {
compile 'com.google.dagger:dagger:2.11'
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
}
Dagger2注入流程图过程
注意:Component查找优先级Moudle高于Inject
Dagger2 基本使用 @Inject @Moudle @Provides @Component
通过@Inject User 对象,注入一次即可,多个构造函数无须多次注入
package com.lhw.daggerdemo.bean;
import javax.inject.Inject;
public class User {
private DataInfo mDataInfo;
public String name;
public int age;
public String tag;
@Inject
public User() {
}
public User(DataInfo data, String tagName) {
tag = tagName;
mDataInfo = data;
}
public User(String tagName) {
tag = tagName;
}
public User(DataInfo dataInof) {
mDataInfo = dataInof;
}
}
新建Moudle实体类添加注解@Moudle,添加User实例化方法,给方法添加@Providers注解,提供对外@Component查找
import dagger.Module;
import dagger.Provides;
@Module
public class UserModule {
@Provides
User providerUser(){
return new User();
}
}
新建接口MianComponent 添加@Component注解,添加 UserModule 到moudles中,然后新增一个inject 方法注入到Activity/Fragment中
注意:这里可以添加多个moudle,也可以通过dependencies依赖其他Component
@Component(modules ={UserModule.class})
public interface MianComponent {
void inject(MainActivity activity);
}
然后我们点击Build,rebuild project构建项目工程,就会在我们的App build输出目录下面generated/ap_generated_sources/debug/out/packageName/下面出现我们的构建的工厂实体实体类
public final class DaggerMianComponent implements MianComponent {
...
private Provider<User> providerUserProvider;
private MembersInjector<MainActivity> mainActivityMembersInjector;
private DaggerMianComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
public static MianComponent create() {
return new Builder().build();
}
@Override
public void inject(MainActivity activity) {
mainActivityMembersInjector.injectMembers(activity);
}
...
}
最后一步我们把构建好的实体类,注入到Activity/Fragment中
import javax.inject.Inject;
import com.lhw.daggerdemo.component.Dagge