项目中用到了Dagger2,先抽出来说说具体使用
1,在builde.gradle中先添加依赖
implementation 'com.google.dagger:dagger:2.13'
implementation 'com.google.dagger:dagger-android-support:2.13' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-compiler:2.13'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.13'
2,添加一个APPComponent
/**
* Created by zhang on 2019/7/19 0019.
* Desc:
*/
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
ConfigModule.class
})
public interface APPComponent extends AndroidInjector<MyApplication> {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<MyApplication> {
abstract Builder configModule(ConfigModule configModule);
@Override
public void seedInstance(MyApplication instance) {
configModule(new ConfigModule(instance));
}
}
}
2.1,添加ConfigModule
@Module
public class ConfigModule {
private Application application;
public ConfigModule(Application application) {
this.application = application;
}
}
3,添加User对象 并用@Inject注解其构造方法
@Singleton
public class User {
private String name;
@Inject
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void callWork(String name) {
Log.e("===z",name + "正在学习Dagger");
}
}
点击Build编译项目,会在AS下生成

4,在Application中继承DaggerApplication并初始化Dagger
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAPPComponent.builder().create(this);
}
调用
public class MyApplication extends DaggerApplication {
@Inject
User mUser;
@Override
public void onCreate() {
super.onCreate();
mUser.callWork("MengkZ");
}
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAPPComponent.builder().create(this);
}
}
运行结果:

Dagger2最简单的使用就从项目中抽出来了
二:在Activity中调用
添加有@@Module的ActivityModules
@Module
abstract class ActivityModules {
@ActivityScope
@ContributesAndroidInjector
abstract MainActivity mainActivityInject();
}
在APPComponent中添加该ActivityModules
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
ConfigModule.class,
ActivityModules.class
})
public interface APPComponent extends AndroidInjector<MyApplication> {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<MyApplication> {
abstract Builder configModule(ConfigModule configModule);
@Override
public void seedInstance(MyApplication instance) {
configModule(new ConfigModule(instance));
}
}
}
在Activity中统一注入,需要在onCreate方法的super之前注入
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
//统一注入,要在super之前。
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
调用
@Inject
User mUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
//统一注入,要在super之前。
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUser.callWork("Activity中Mengk");
}
结果

原理:
Dagger2再也没有使用反射:图的验证、配置和预先设置都在编译的时候执行。
网友评论