前言
Dagger2是首个使用生成代码实现完整依赖注入的框架,使用APT技术,以下我们通过四个方面来讲解Dagger2。
- 一. dagger2 简单理解
- 二. dagger2 基本使用
- 三. dagger2 单例(全局,局部)
- 四. dagger2 @Scope注解
一.dagger2 简单理解
- 一般我们使用一个实体类或者工具或者请求,比如在MainActivity中使用UerInfo.class,我们会在new Userinfo(),去使用
而dagger帮我们省略了这一步,dagger去管理new UserInfo(),我们直接在Activity中使用。 - dagger 理解其实就是相当于买了快递后,快递送货流程
- 实现此流程需要四个注解 @Module @Component @Provides @Inject
-
如图
dagger
二.dagger2 基本使用
- 在build.gradle中引入插件
// dagger2 的功能支持
implementation 'com.google.dagger:dagger:2.4'
// dagger2 自己的注解处理器
annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
- UserInfo 对象-->快递
// 正常业务的一个对象
public class UerInfo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- Userinfo对象-->包裹
// 将对象进行包裹->方便与Dagger使用
@Module // 包裹注解
public class UerInfoModle {
@Provides // 暴露出去注解
public UerInfo uerInfoInit(){
return new UerInfo();
}
}
- 快递员
// 类似于快递员,拿到所有包裹->根据地址配给用户
// 依赖注入
@Component(modules = {UerInfoModle.class, DataObjModle.class, HttpObjModle.class})
public interface AppCompont {
// 目标注入地址
void injectMainAct(MainActivity activity);
}
5.MainActivity用户使用-->接收快递
public class MainActivity extends AppCompatActivity {
@Inject // 注解处理器
public UerInfo uerInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 方式1: 注入
DaggerAppCompont.create().injectMainAct(this);
// 方式2:
// DaggerAppCompont.builder().uerInfoModle(new UerInfoModle()).build().injectMainAct(this);
TextView textView = findViewById(R.id.txtView);
uerInfo.setAge("11");
uerInfo.setName("宅已經");
}
}
三.dagger2 单例
- 全局单例:存在于整个项目,只有一个实例,需要增加一个单例注解 @Singleton,全局单例需要配合Application使用,否则只能是当前activity单例。
- 增加增加单例注解@Singleton,只不过封装application,注册使用的是第二种方式。
- 注解注册方式两种:
// 方式1: 注入
DaggerAppCompont.create().injectMainAct(this);
// 方式2:
// DaggerAppCompont.builder().uerInfoModle(new UerInfoModle()).build().injectMainAct(this);
增加单例注解
类和方法上面,两处增加
// 将对象进行包裹->方便与Dagger使用
@Module // 包裹注解
@Singleton
public class UerInfoModle {
@Provides // 暴露出去注解
@Singleton
public UerInfo uerInfoInit(){
return new UerInfo();
}
}
接口上面只增加一处
// 类似于快递员,拿到所有包裹->根据地址配给用户
// 依赖注入
@Singleton
@Component(modules = {UerInfoModle.class, DataObjModle.class, HttpObjModle.class})
public interface AppCompont {
// 目标注入地址
void injectMainAct(MainActivity activity);
}
自定义Application注入
public class MyApplication extends Application {
AppCompont uerInfoModleBuilder = null;
public AppCompont getUerInfoCompont(){
if (uerInfoModleBuilder==null){
uerInfoModleBuilder = DaggerAppCompont.builder().uerInfoModle(new UerInfoModle()).build();
}
return uerInfoModleBuilder;
}
}
3.1 全局单例 使用
- 完成上面步骤后
- 必须使用@Singleton注解
- Application已经有了AppCompont 对象
满足上面两个条件,可保证是全局单例
((MyApplication)getApplication()).getUerInfoCompont().injectMainAct(this);
3.2 局部单例 使用
- 完成上面步骤后
- 必须使用@Singleton注解
只能保证在当前Activity中是单例
DaggerAppCompont.create().injectMainAct(this);
3.3 注意
- 若不使用@Singleton 注解,使用哪个方式注入都一样。
四.dagger2 @Scope注解
- 使用@Scope自定义注解
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
- 包裹使用
// 将对象进行包裹->方便与Dagger使用
@Module // 包裹注解
@ActivityScope
public class UerInfoModle {
@Provides // 暴露出去注解
@ActivityScope
public UerInfo uerInfoInit(){
return new UerInfo();
}
}
- 快递员使用
// 类似于快递员,拿到所有包裹->根据地址配给用户
// 依赖注入
@ActivityScope
@Component(modules = {UerInfoModle.class, DataObjModle.class, HttpObjModle.class})
public interface AppCompont {
// 目标注入地址
void injectMainAct(MainActivity activity);
}
@Scope效果和@Singleton效果一样。
网友评论