Android Dagger2使用

2023-02-20  本文已影响0人  翟小乙

前言

Dagger2是首个使用生成代码实现完整依赖注入的框架,使用APT技术,以下我们通过四个方面来讲解Dagger2。

一.dagger2 简单理解

  1. 一般我们使用一个实体类或者工具或者请求,比如在MainActivity中使用UerInfo.class,我们会在new Userinfo(),去使用
    而dagger帮我们省略了这一步,dagger去管理new UserInfo(),我们直接在Activity中使用。
  2. dagger 理解其实就是相当于买了快递后,快递送货流程
    • 实现此流程需要四个注解 @Module @Component @Provides @Inject
  3. 如图


    dagger

二.dagger2 基本使用

  1. 在build.gradle中引入插件

    // dagger2 的功能支持
    implementation 'com.google.dagger:dagger:2.4'
    // dagger2 自己的注解处理器
    annotationProcessor 'com.google.dagger:dagger-compiler:2.4'

  1. UserInfo 对象-->快递
// 正常业务的一个对象
public class UerInfo {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  1. Userinfo对象-->包裹
// 将对象进行包裹->方便与Dagger使用
@Module // 包裹注解 
public class UerInfoModle {
  @Provides // 暴露出去注解 
  public UerInfo uerInfoInit(){
      return  new UerInfo();
  }
}
  1. 快递员
// 类似于快递员,拿到所有包裹->根据地址配给用户
// 依赖注入
@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 单例

// 方式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 全局单例 使用

满足上面两个条件,可保证是全局单例

((MyApplication)getApplication()).getUerInfoCompont().injectMainAct(this);

3.2 局部单例 使用

只能保证在当前Activity中是单例

DaggerAppCompont.create().injectMainAct(this);

3.3 注意

四.dagger2 @Scope注解

  1. 使用@Scope自定义注解
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
  1. 包裹使用
// 将对象进行包裹->方便与Dagger使用
@Module // 包裹注解
@ActivityScope 
public class UerInfoModle {
    @Provides // 暴露出去注解
    @ActivityScope 
    public UerInfo uerInfoInit(){
        return  new UerInfo();
    }
}
  1. 快递员使用
// 类似于快递员,拿到所有包裹->根据地址配给用户
// 依赖注入
@ActivityScope 
@Component(modules = {UerInfoModle.class, DataObjModle.class, HttpObjModle.class})
public interface AppCompont {
    // 目标注入地址
    void injectMainAct(MainActivity activity);
}

@Scope效果和@Singleton效果一样。

下一篇->Android Hilt使用

上一篇 下一篇

猜你喜欢

热点阅读