引入依赖
dependencies {
implementation 'com.google.dagger:dagger-android:2.x'
implementation 'com.google.dagger:dagger-android-support:2.x' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.x'
annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}
使用构造方法注入 @Inject
public class User {
// 步骤一 创建User 类, 并使用@Inject 注解,通过dagger2 通过构造方法注入实例.
@Inject
public User(){
}
}
创建创建Component 组件
// 步骤二, 是一个接口. 执行注入动作.
@Component()
public interface UserCommponent {
// 参数 ,指定要注入的目标类, 也就是Activity.
void inject(TextDaggerActivity activity);
}
声明/使用注入对象
// 第三步, 使用user类.
@Inject
User user;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 第四步, 执行注入动作.
DaggerUserCommponent.create().inject(this);
Log.e("TextDaggerActivity user: ",user + " ");
}
// E/----: address: com.zh.hellokotlin.dagger.bean.User@5707fc6
使用模块方法注入 @Module
在一些复杂的情况下需要Module的方式来实例化对象.这里模拟网络请求.
public interface Api {
@POST("/api/v1/login")
Call<String> login();
}
步骤一 创建Module 类
// 主要注意类名, 使用@Module 注解.
@Module
public class NetWorkModule {
// 使用Provides 注解实例化对象, 函数一般以provide开头,返回对象本身.
@Provides
public Retrofit provideRetrofit(){
return new Retrofit.Builder()
.baseUrl("https://www.google.com")
.build();
}
@Provides
public Api providesApi(Retrofit retrofit){
return retrofit.create(Api.class);
}
}
步骤二 创建Component组件,使用Module.
@Component(modules = NetWorkModule.class)
public interface ApplicationCommponent {
void inject(TextDaggerActivity mainActivity);
}
使用Retrofit实例
@Inject
Retrofit retrofit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 需要执行注入动作! 并且在使用变量之前!
DaggerApplicationCommponent.create(). inject(this);
Log.e("----","address: "+user);
Log.e("retrofit----","address: "+retrofit);
}
// E/----: address: com.zh.hellokotlin.dagger.bean.User@5707fc6
// E/retrofit----: address: retrofit2.Retrofit@f8eb87
- @Module : 表示这个类的类型,便于注入到容器中.
- @Provides : 这个注解用到了函数上,主要是用于创建对象.
- @Component : 是一个接口,参数modules接收的类型是一个数组,表示被装入容器的Module有那些. 函数 inject(XX xx),表示这个容器中的功能对象,比如Retrofit,Api, 可以在XX类中使用.
网友评论