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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏zhisheng

渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)

上篇文章写了 ElasticSearch 源码解析 —— 环境搭建 ,其中里面说了启动 打开 server 模块下的 Elasticsearch 类:org.e...

14910
来自专栏java工会

Spring Boot 自动配置的 “魔法” 是如何实现的?

Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快...

9300
来自专栏拭心的安卓进阶之路

Android 进阶7:进程通信之 AIDL 的使用

记得 2015 年实习面试,笔试题里就有这道题:请介绍下 AIDL。 当时的我是懵逼的,只好老老实实空着。没想到后来面试时面试官大哥嘿嘿一笑说他也没用过这玩意,...

23280
来自专栏菩提树下的杨过

dubbo/dubbox 增加原生thrift及avro支持

(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,d...

43980
来自专栏java思维导图

自己手写一个 SpringMVC 框架

前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课. Spring 框架对于 Java 后端...

42860
来自专栏Java架构沉思录

Spring Boot是如何实现自动配置的

Spring Boot 是 Spring 旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为...

14130
来自专栏精讲JAVA

Spring Boot 自动配置的 “魔法” 是如何实现的?

Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快...

12320
来自专栏石奈子的Java之路

原 SpringBoot 2.0 系列00

15240
来自专栏微信公众号:Java团长

Spring Boot 自动配置的“魔法”是如何实现的?

Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快...

14620
来自专栏上善若水

021android初级篇之android的Context

021android初级篇之Android注解支持(Support Annotations)

12830

扫码关注云+社区

领取腾讯云代金券