dagger的简单使用

前言

虽然有了更好的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);

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值