前言
虽然有了更好的hilt框架,但是许多老项目中还有在使用dagger 下面就来简单了解一下吧。
添加依赖
上面的是dagger的依赖
//dagger相关依赖
implementation 'com.google.dagger:dagger:2.7'
annotationProcessor 'com.google.dagger:dagger-compiler:2.7'
//retrofit相关依赖
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
方式一 使用Inject注解
1、: 使用Inject注解 在构造方法上 就是告知dagger可以通过构造方法来创建,并获得User实例
public class User {
//1 使用Inject注解 在构造方法上 就是告知dagger可以通过构造方法来创建,并获得User实例
@Inject
public User() {
}
}
2、实现dagger组件接口 ioc容器
@Component
public interface ApplicationComponent {
void inject(MainActivity mainActivity);
}
3、在使用到对象的activity中定义变量 使用Inject注解
//3 定义变量使用Inject注解
@Inject
User user;
4、执行注入动作 在Activity OnCreate方法,执行注入动作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//4 执行注入动作
DaggerApplicationComponent.create()
.inject(this);
//打印User对象实例
Log.d(TAG, "user:"+user);
}
方式二:使用Modlue注解 完成网络请求Retrofit相关实例创建
1、创建dagger模块类
这里使用常用的retorfit构建的例子,例子中只是简单创建了一些相关的实例
这里使用到@Singleton 意思是创建单例类,即全局唯一的对象实例
//dagger模块
@Module
public class NetModule {
//第二种方式告知dagger 可以通过调用该方法来获取需要注入的对象的实例
@Singleton//表示单例
@Provides
public Retrofit provideRetrofit(OkHttpClient okHttpClient){
return new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http//:www.baudu.com")
.build();
}
@Singleton
@Provides
public ApiService provideApiService(Retrofit retrofit){
return retrofit.create(ApiService.class);
}
@Singleton
@Provides
public OkHttpClient provideOkHttpClient(){
return new OkHttpClient.Builder()
.build();
}
}
2、实现dagger组件接口 ioc容器
由于我们第上一步中使用了 @Singleton这里我们也需要使用这个注解。
@Component(modules = NetModule.class)
这里我们填入对应的modules 名,如果有多个 可以使用{ }的方式添加。
@Singleton
@Component(modules = NetModule.class)
public interface ApplicationComponent {
void inject(MainActivity mainActivity);
}
3、在Activity中声明对象同样也是用到Inject注解
要注意的我们这里为了验证是单例的,我们创建了一个user2对象(没有使用单例注解),和一个okHttpClient2对象(使用了单例注解Singleton),稍后我们在打印结果中查看对象是否同一个。
@Inject
User user;
@Inject
User user2;
@Inject
Retrofit retrofit;
@Inject
ApiService apiService;
@Inject
OkHttpClient okHttpClient;
@Inject
OkHttpClient okHttpClient2;
4 Activity onCreate方法中 执行注入动作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//4 执行注入动作
DaggerApplicationComponent.create()
.inject(this);
//验证得出 user和user2不是同一个对象
Log.d(TAG, "user:"+user);
Log.d(TAG, "user:"+user2);
Log.d(TAG, "Retrofit:"+retrofit);
Log.d(TAG, "ApiService:"+apiService);
//验证得出 okHttpClient和okHttpClient2是同一个对象
Log.d(TAG, "OkHttpClient:"+okHttpClient);
Log.d(TAG, "OkHttpClient:"+okHttpClient2);
}