专栏首页Android机动车Dagger2系列——初识

Dagger2系列——初识

经过一段时间的纠结和水深火热,终于渐渐领悟了Dagger2,在此分享一下学习心得,希望同样对Dagger2水深火热的你们有点帮助。

接下来会分享一系列Dagger2内容。

Dagger2中常用的注解名词以及含义

- @Component :用于注解一个interface, 比如:

@Singleton
@Component(modules = {AppModule.class, RetrofitModule.class})
public interface AppComponent {

    IRetrofitRequest request();

    Context getContext();
}

这里用@Component标注的AppComponent接口,提供了两个方法,一个返回的是IRetrofitRequest,一个是Context。 但是这两个对象在哪里实例化呢?

编译代码:Dagger2会自动生成一个叫DaggerAppComponent的类,该类会根据@Component(modules = {AppModule.class, RetrofitModule.class}),这里的AppModule和RetrofitModule两个类中去寻找IRetrofitRequest和Context实例化的对象。如下介绍@Module

-@Module:给添加了@Component注解的interface类提供实例化对象的类,比如:

@Module
public class AppModule {
    private Context context;

    public AppModule(Context context) {
        this.context = context;
    }

    @Provides//注意需要加上@Provides
    public Context getContext() {
        return context;
    }
}
@Module
public class RetrofitModule {

    @Provides//提供对象,必须添加该注解
    @Singleton//单例模式,这里的IRetrofitRequest 是全局的对象,接口调用的时候需要用到该类(自定义)
    public IRetrofitRequest getService() {
        //打印拦截器
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient httpClient = new OkHttpClient.Builder()
                .addInterceptor(logging)//添加打印拦截器
                .connectTimeout(30, TimeUnit.SECONDS)//设置请求超时时间
                .retryOnConnectionFailure(true)//设置出现错误进行重新连接。
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(UrlConst.URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(httpClient)
                .build();
        return retrofit.create(IRetrofitRequest.class);
    }
}

这里需要注意的是提供实例化对象的方法上需要添加@Provides注解

- @Provides:在标有@Module注解类的内部方法上,提供对象实例。

- @Singleton:单例-Dagger2帮我们实现的一个@Scope作用域。

-@Inject:需要用@Inject注解的地方主要有3,如下

  • 用于标注需要被实例化的对象
  • 提供实例化对象的构造函数
  • 当类被实例化对象之后,需要马上执行的方法
public class A {
    @Inject
    B b;//需要被实例化的对象
}
public class B {
    @Inject//提供对象的实例化构造函数
    public B() { 
    }
    @Inject//当构造函数被执行之后,立马执行改方法
    public void setPresenter(){
      xxx;
    }
}

-最关键的是执行编译之后

Dagger2会自动生成很多类文件,其中一个就是DaggerXXX,这里的XXX就是用@Component标注的接口名,比如生成了DaggerAppComponent类文件,该类文件实现了AppComponent接口,并且根据相关的@Module提供的实例进行初始化。

public class App extends Application {
    private static AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(getApplicationContext()))//AppComponent关联的AppModule类
                .retrofitModule(new RetrofitModule()) //AppComponent关联的RetrofitModule类
                .build();
    }

    public static AppComponent getComponent() {
        return appComponent;
    }
}

本文分享自微信公众号 - Android机动车(JsAndroidClub),作者:贾帅

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Retrofit动态切换baseUrl

    说明:对于一些功能,需要多个BaseURl来请求不同服务器地址的api,我不可能有几个BaseURl,我就实例化几个Retrofit实例。这样做很不科学,要是B...

    蜻蜓队长
  • 轻松又酷炫地实现弹幕效果——手把手教学

    更多代码,请查看我的github:https://github.com/shuaijia/JsPlayer ,喜欢的话就给个star!^_^

    蜻蜓队长
  • Dagger2系列——实例解析

    这篇文章会分享一下实际应用中的Dagger2如何使用,以及Dagger2通过apt插件如何给我们生成代码,以及生成的代码之间的关联。

    蜻蜓队长
  • fastjson远程代码执行漏洞问题分析

    fastjson远程代码执行安全漏洞(以下简称RCE漏洞),最早是官方在2017年3月份发出的声明,

    用户7634691
  • 全文搜索实战2-ik分词及搜索高亮

    数据存储功能基于mybatisplus框架,实现相关entity和mapper等即可。

    技术路漫漫
  • 用工厂方法模式来下不同订单 顶

    Controller如下,用传递的内容来判断是哪种类型的订单,并给抽象订单工厂来获取具体的订单工厂,通过具体的订单工厂来生成订单服务,完成下单功能。考虑到线程安...

    算法之名
  • 排序算法Java代码实现(一)—— 选择排序

    以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦!

    CherishTheYouth
  • c++之继承

    我们发现父类的所有属性都被继承了,但是private类型的属性在子类中却不能被访问。

    绝命生
  • 细说SpringBoot的自动装配原理

      对于spring框架,我们接触得比较多的应该是spring mvc、和spring。而spring的核心在于IOC(控制反转对于spring框架来说,就是由...

    用户4919348
  • [Spring cloud 一步步实现广告系统] 10. 使用Ribbon 实现微服务调用

    在使用Ribbon调用广告投放系统API之前,我们需要先创建2个VO对象,AdPlanVO,AdPlanGetRequestVO.

    Isaac Zhang

扫码关注云+社区

领取腾讯云代金券