Dagger 2 完全解析(四),Android 中使用 Dagger 2

dagger2之android源码解析(dagger-compiler你在哪) 首先照常理来一份参考地址:Android - Dagger2使用详解,这里说的还行,但是并没有涉及到源码部分,如果没有像我这种纠结症的完全可以参考去使用。dagger这个我用的并不多(咱实话实话了,之前用了下,但是感觉好麻烦,我认为项目中没必要用到它),因为我现在在细品AAC里面的demo,GithubBrowserSample中有使用到,第一为了学习,第二别人家碗里的肉肯定都是香的,所以就有了这么一篇根据demo中案例捋一遍源码。 ... 阅读详情

Dagger 2 完全解析系列:

Dagger 2 完全解析(一),Dagger 2 的基本使用与原理

Dagger 2 完全解析(二),进阶使用 Lazy、Qualifier、Scope 等

Dagger 2 完全解析(三),Component 的组织关系与 SubComponent

Dagger 2 完全解析(四),Android 中使用 Dagger 2

Dagger 2 完全解析(五),Kotlin 中使用 Dagger 2

Dagger 2 完全解析(六),dagger.android 扩展库的使用

上面文章地址是我博客上的地址,本系列文章是基于 Google Dagger 2.11-rc2 版本

在理解了 Dagger 2 完全解析系列的前三篇文章后,可能还是会对在 Android 实际项目中如何使用 Dagger 2 有些疑问,本文以 GoogleSamples 的 android-architecture(mvp 分支) 为例,逐步说明如何在 ToDo 项目中使用 Dagger 2。

本文中代码示例的地址:https://github.com/JohnnyShieh/ToDo/tree/mvp

使用 Dagger 2 后的代码地址:https://github.com/JohnnyShieh/ToDo/tree/mvp-dagger2

Android 中使用 Dagger 2

为了具有代表性,我选择 android-architecture 中的 todo-mvp 作为例子,MVP 架构大家都比较熟悉。现在假设我们的 Android 项目为 ToDo,那么如何引入 Dagger 2 实现依赖注入?

绘制依赖关系图

在使用 Dagger 2 之前,需要理清项目的中依赖关系,这样方便设计 Component,建议大家引入 Dagger 2 之前也绘制下大致的依赖关系图。ToDo 项目中的依赖关系如下图:

ToDo 项目中依赖关系非常简单,4 个 Activity 各自依赖自己的 Presenter,而 Presenter 依赖同一个 TaskRepository 对象。在 Android 项目,依赖关系一般以 Activity、Fragment 这些组件开始划分,因为 app 运行中是以这些组件存在的,所以在后面的 Component 的划分中一般以 Activity、Fragment 来划分。

绘制 Component 依赖关系图

在确定了项目依赖关系,就可以以此划分 Component,从而进一步绘制 Dagger 2 中的依赖关系图。4 个 Activity 分别对应一个 Component,而这 4 个 Component 都依赖一个 TasksRepository。所以还需要一个 Component 提供单例的 TasksRepository 依赖,一般是 AppComponent,用来管理 app 中单例的依赖,而其他 Activity 的 Component 是 AppComponent 的 SubComponnet。

AddEditTaskComponent、StatisticsComponenet、TaskDetailComponent、TasksComponent 都继承 AppComponent,共享同一个 TasksRepository 依赖。

引入 Dagger 2

添加 Dagger 2 依赖,在第一篇文章也有讲述:

dependencies {
    ...
    compile 'com.google.dagger:dagger:2.11-rc2'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.11-rc2'
}

上面已经设计好 Component 依赖关系图,下面看看具体的 Component、Module 的编写。

先看看 TasksComponent,其他三个 SubComponent 也是类似的:

@ActivityScope
@Subcomponent(modules = TasksPresenterModule.class)
public interface TasksComponent {

    void inject(TasksActivity activity);

    @Subcomponent.Builder
    interface Builder {     // SubComponent 必须实现 @Subcomponent.Builder 接口
        @BindsInstance
        Builder view(TasksContract.View view);   // 在创建 Component 前绑定 TasksContract.View 依赖

        TasksComponent build();
    }
}

@Module
public class TasksPresenterModule {

    @Provides
    @ActivityScope
    TasksPresenter provideTasksPresenter(TasksRepository tasksRepository, TasksContract.View view) { // tasksRepository 实例由 AppComponent 提供,而 view 实例由 TasksComponent.Builder 中的 view(TasksContract.View view) 方法提供
        return new TasksPresenter(tasksRepository, view);
    }
}

首先来看@ActivityScope注解,这是一个自定义作用域,和网上一些示例中的@PerActivity类似。@ActivityScope可以让 TasksComponent 间接持有 TasksPresenter 的引用,而且增加可读性,表示 TasksComponent 的生命周期应该在对应的 Activity 中。

TasksComponent 作为 SubComponent 必须实现@Subcomponent.Builder接口,因为 TasksComponent 的创建必须由 AppComponent 调用 TasksComponent.Builder 完成。TaskPresenter 还需要 TasksContract.View 依赖,但是它只能在创建 TasksComponent 时提供,有两种方法:(1)TasksPresenterModule 把 TasksContract.View 作为构造函数参数,这样 TasksComponent.Builder 还需要添加Builder tasksPresenterModule(TasksPresenterModule module);(2)使用@BindsInstance方法,如同上面的代码一样,更多关于@BindsInstance请看 Dagger 2 完全解析(二),进阶使用 Lazy、Qualifier、Scope 等的末尾部分。这时推荐使用第二种方法,简单明了。

上面可以看到 TasksPresenterModule 的 provideTasksPresenter 方法中还有参数,provide 方法中的参数必须由绑定的 Component 提供依赖,而这里 tasksRepository 实例由 AppComponent 提供依赖,view 实例由@BindsInstance方法绑定到 TasksComponent 提供。

看完 SubComponent,再看 AppComponent:

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

    TasksRepository tasksRespository();

    AddEditTaskComponent.Builder addEditTaskComponent();

    StatisticsComponenet.Builder statisticsComponenet();

    TaskDetailComponent.Builder taskDetailComponent();

    TasksComponent.Builder tasksComponent();
}

@Module(subcomponents = {AddEditTaskComponent.class, StatisticsComponenet.class,
    TaskDetailComponent.class, TasksComponent.class})
public class AppModule {

    private final Context mContext;

    public AppModule(Context context) {
        mContext = context;
    }

    @Provides
    @Singleton
    Context provideContext() {
        return mContext;
    }
}

@Module
public class TasksRepositoryModule {

    @Provides
    @Singleton
    @Local
    TasksDataSource provideTasksLocalDataSource(Context context) {
        return new TasksLocalDataSource(context);
    }

    @Provides
    @Singleton
    @Remote
    TasksDataSource provideTasksRemoteDataSource() {
        return new TasksRemoteDataSource();
    }
}

上面可以看到 AppModule 提供了 ApplicationContext 依赖,而且确定了 4 个 SubComponent 的继承关系。TasksRepositoryModule 提供了两个 TasksDataSource 依赖(TasksRepositoryModule 在 prod 和 mock 中各有一份),用@Local和@Remote两个自定义 Qualifier 区分,但是没有提供 TasksRepository 依赖,那么 AppComponent 管理的 TasksRepository 依赖从哪里来呢?大家不要忘记了提供依赖的两种方法 Module 和 Inject 构造函数。

@Singleton
public class TasksRepository implements TasksDataSource {
    ...
    @Inject
    TasksRepository(@Remote TasksDataSource tasksRemoteDataSource,
                            @Local TasksDataSource tasksLocalDataSource) {
        mTasksRemoteDataSource = checkNotNull(tasksRemoteDataSource);
        mTasksLocalDataSource = checkNotNull(tasksLocalDataSource);
    }
    ...
}

AppComponent 调用 Inject 构造函数创建 TasksRepository 时,会使用 TasksRepositoryModule 提供的两个 TasksDataSource 依赖。推荐大家 clone ToDo 到本地,编译后到app/build/generated/source/apt/目录下看 DaggerAppComponent 的源码,这里就不为大家分析,之前介绍 Component 时有分析过它的原理。

调用 Component 完成依赖注入

最后一步就是使用 Component 完成依赖注入了,先看 AppComponent:

public class ToDoApplication extends Application {

// Application 只生成一个 AppComponent,AppComponent 只生成一个 TasksRepository,以此来完成 TasksRepository 的单例
    private AppComponent mAppComponent; 

    @Override
    public void onCreate() {
        super.onCreate();

// AppComponent 这里为任何 target 注入依赖,是为它的 SubComponent 提供依赖的。
        mAppComponent = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .tasksRepositoryModule(new TasksRepositoryModule())
            .build();
    }

    public AppComponent getAppComponent() { // 提供该接口后是为了 Activity 调用
        return mAppComponent;
    }
}

再看 TasksComponent 的使用:

public class TasksActivity extends AppCompatActivity {
    ...
    @Inject
    TasksPresenter mTasksPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        // 调用 AppComponent..tasksComponent() 返回 TasksComponent.Builder 创建 TasksComponent
        ((ToDoApplication) getApplication()).getAppComponent()
            .tasksComponent()
            .view(tasksFragment)    // @BindsInstance 方法必须在 build 前调用
            .build()
            .inject(this);
        ...
    }
}

其他几个 SubComponent 的调用过程也是类似的。

其他 Dagger 2 使用示例

除了上面 ToDo App 的示例,我还写了一个 Gank Android 客户端,基于 Dagger 2、Rx Java、Retrofit、Glide等开源库使用 RxFlux 架构,里面还有 FragmentComponent 部分,Component 的继承关系为 FragmentComponent -> ActivityComponent -> AppComponent,有兴趣的朋友可以去看下。

总结

  • 一般会有个 AppComponent,管理 app 中的单例依赖,同时提供 ApplicationContext 依赖。

  • 一般一个页面对应一个 Component,例如 Activity、Fragment 对应各自的 Component,但是两个页面的依赖相同时,可以用同一个 Component。

  • Android 中推荐使用 Component 的继承关系。

  • 尽量多使用 Scope 作用域,增加可读性还能方便控制依赖实例的生命周期。

如何在 Android 项目中使用 Dagger 2 就讲解到这里,有什么问题欢迎各位在下面留言。

本来 Dagger 2 完全解析系列第五篇文章,是打算写 2.9 版之后新增的 dagger.android 扩展库关于 Android 中使用 Dagger 2 的简化写法的,但是发现 dagger.android 还有部分缺陷(如 SubCompoennt 的 Module 不能构造函数,也不能自定义 @BindsInstance 方法等),所以打算等 dagger.android 更成熟后再介绍。而现在 kotlin 大火,所以第五篇文章改为如何在 kotlin 语言的 Android 项目中使用 Dagger 2。



作者:JohnnyShieh
链接:https://www.jianshu.com/p/fe0fd2c9df61
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Android SystemUI——使用Dagger2加载组件(四) SystemUI模块在源码中的路径为framework/base/package/SystemUI,本质上来说它也是一个APK(Android应用程序包)。虽然SystemUI在技术层面上是一个APK,但它的角色和行为远远超出了普通应用程序的范畴,作为一个系统级别的应用,它不仅享有更高的权限,而且对于维持Android设备的基本操作和用户体验至关重要。 阅读详情

相关推荐

顺序功能图基本结构

顺序功能图(Sequential Function Chart,SFC)是一种用于描述工业控制系统中顺序控制流程的图形化编程语言,广泛应用于PLC(可编程逻辑控制器)编程。其核心思想是将复杂的控制流程分解为多个有序的步骤,通过逻辑条件实现步骤间的切换。顺序功能图通过图形化的方式简化了复杂控制逻辑的设计,尤其适用于需要严格顺序控制的工业自动化场景。[初始步] → 转换条件1 → [步1] → 转换条件2 → [步2] → ...[步X] → → [步B] → 转换条件B → → [合并步]

ayingqin1的博客 1224

dagger android,Dagger 2 在 Android 上的使用(四)

本文介绍了Dagger 2 中@BindsInstance和多绑定的使用。《咏柳》碧玉妆成一树高,万条垂下绿丝绦。不知细叶谁裁出,二月春风似剪刀。-唐,贺知章注解@BindsInstance有些情况下当组件构造时数据才可用,你可能想把它的实例绑定到组件上,我们可以使用@BindsInstance注解完成。Component可以有一个使用@Component.Builder注解的静态抽象类或接口,如...

weixin_28761725的博客 233

探索Three.js:利用ShaderMaterial实现动态着色器特效

本文深入探讨了Three.js中ShaderMaterial的应用,指导开发者利用GLSL编写自定义着色器实现动态特效。文章从核心概念GLSL、Uniforms与Attributes讲起,通过创建动态颜色变化平面的实战案例,逐步进阶到实现波纹扩散与动态光影等高级效果,并提供了性能优化与调试技巧,帮助读者掌握创建高性能WebGL视觉特效的关键技能。

weixin_29250403的博客 201

Dagger 2 完全解析(四),在Android中的使用

Dagger 2 完全解析(四),在Android中的使用 Dagger 2 完全解析(一),基本使用与原理 Dagger 2 完全解析(二),进阶使用 Dagger 2 完全解析(三), Component 与 SubComponent Dagger 2 完全解析(四),在Android中的使用 本系列文章是基于 Google Dagger 2.23.2 版本, Kotlin 1.3.21...

xiaowu 专栏 999

SpringDoc 基本使用指南

SpringDoc 凭借零配置启动注解简洁和深度兼容 Spring 生态的优势,已成为 Spring Boot API 文档的首选工具。自动化- 减少手动维护文档的成本;标准化- 严格遵循 OpenAPI 3 规范;可扩展- 分组、安全控制灵活适配复杂项目。访问即可查看交互式文档(默认路径)

墨鸦的博客 1万+

通用定时器脉冲计数实验(STM32CubeMx配置)

通用定时器脉冲计数实验

a1169511636的博客 5509

Dagger 2 完全解析(五),Kotlin 中使用 Dagger 2

Dagger 2 完全解析系列:Dagger 2 完全解析(一),Dagger 2 的基本使用与原理Dagger 2 完全解析(二),进阶使用 Lazy、Qualifier、Scope 等Dagger 2 完全解析(三),Component 的组织关系与 SubComponentDagger 2 完全解析(四),Android 中使用 Dagger 2Dagger 2 完全解析(五),Kotlin...

晨光飞舞的专栏 2459

基于STM32单片机设计的智能水温控制系统

本项目研究并实现了一种基于STM32单片机的智能水温控制系统。系统以STM32F103RCT6作为主控制器,通过DS18B20温度传感器实时采集水温数据,利用PID控制算法精确调节5V直流防水型70W加热棒的功率输出,确保水温恒定在设定范围内。此外,采用OLED显示屏显示当前水温和预设上限阀值,并集成ESP8266-WiFi模块与自研Android手机APP进行远程通信和控制。用户可通过本地按键或手机APP设置温度阀值,实现实时监控与智能化管理。整个系统设计旨在提高水资源利用效率,提升生活及工业用水环境的舒

8789

dagger android,在Android开发中使用Dagger2的方法

在Android开发中使用Dagger2的方法发布时间:2020-12-08 17:12:38来源:亿速云阅读:236作者:Leah在Android开发中使用Dagger2的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用方法如下:@Component(modules = MyAppModule.class)public abs...

weixin_39926104的博客 149

云端全自动AI漫剧生成工作流:从模型选型到完整实现

本文提出了一套云端全自动AI漫剧生成工作流解决方案,旨在解决传统漫剧制作效率低下的问题。该系统采用"编排引擎+模型矩阵"架构,通过集成大语言模型、图像生成、视频合成等技术,实现从剧本输入到成片输出的全流程自动化。 核心内容包括: 模型选型方案:剧本解析采用DeepSeek-V3/GPT-4o,图像生成使用DALL-E 3,视频合成选用Stable Video Diffusion,语音合成采用MiniMax TTS 系统架构设计:基于Celery分布式任务队列的编排层,分解任务至各功能模块

huanghm88的专栏 640

西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤

西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤

Robot_PLC_HMI_Automation 6098

Android环境下dagger2实战指南

文章目录1、依赖项的定义2、依赖项的获取方式3、依赖项注入的定义4、依赖项注入的方式 依赖项注入(Dependency injection —DI) 是一种广泛用于编程的技术,非常适用于 Android 开发。遵循 DI 的原则可以为良好的应用架构奠定基础。 1、依赖项的定义 编程实践中,一个类往往需要引用另外一个或多个类。比如:“汽车”类需要引用“发动机”类等才能运行。这些必须的类称为依赖项。 2、依赖项的获取方式 类可以通过下面的三种方式来获取依赖项: 类本身创建其所需的依赖项: class Car

yangwu007的博客 902

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Dagger 2 完全解析(三),Component与SubComponent

Dagger 2 Component 与 SubComponent Dagger 2 完全解析(一),基本使用与原理 Dagger 2 完全解析(二), 进阶使用 Dagger 2 完全解析(三), Component 与 SubComponent 本系列文章是基于 Google Dagger 2.23.2 版本, Kotlin 1.3.21版本 理解前面两篇文章后,可以使用 Dagge...

xiaowu 专栏 2977

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android Dagger2使用详解

官网地址:https://dagger.dev/ Github地址:https://github.com/google/dagger

hongxue8888的博客 2010

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android框架—Dagger2使用

一、概述 现在android开发越来越多的应用到各种框架,一个好的app架构不但可以支持好的性能,同时也可以更方便快捷的开发功能。依赖注入是java后端开发spring的核心技术,而对于android来说现在由谷歌爸爸亲管的dagger则是不二之选。 二、dagger环境配置 使用Android Studio 创建一个新的项目,在Project的 build.gradle文件添加以下内容...

qq_24442769的博客 4897

dagger2之dagger-android简单使用

dagger2的使用便利我就不用说了,google为方便android开发者进而推出了dagger-android,这里附录官方文档:[https://google.github.io/dagger/android.html] 需要增加依赖: compile 'com.google.dagger:dagger:' + dagger_version compile "com.google

罗春娥的技术园 2117

2024年Android最新听说你还不会用Dagger2?Dagger2 For Android最佳实践教程(3),2024年最新2024互联网大厂Android面经合集

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!Android架构师之路很漫长,一起共勉吧!

2401_84561461的博客 976

【Android】Dagger2 + MVVM

背景 一个标准的Android的MVVM架构是分层规划实现的,各层之间有清晰的依赖关系。借助Dagger2完成MVVM各层所需的依赖注入,可以让项目结构变得更清爽和更可维护。 虽然Dagger2有一定使用门槛,但是MVVM的项目结构大都相同,实现一个Dagger2+Retrofit2(+OkHttp3)+ViewModel 的最小构成实践,对其他类似项目具有一定参考意义。 构成 1. g...

移动端开发干货分享 2294

Dagger 2应用于Android的完美扩展库-dagger.android

Dagger 2应用于Android的完美扩展库 - dagger.android

行云间 1万+

Android Dagger2简单入门

一、什么是dagger2? Dagger2 是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架。我们在做andriod开发的时候,一个Activity里面通常会实例化很多的类,才能使用这些的类中的方法和字段,通常,一个类很多Activity都会用到,我们就会在每个acitivity里面实例化该类。这样导致的问题就是,Activity会很依赖这些类,导致程序的耦合严重

生活不只眼前的苟且,还有诗和远方的田野。 4466

Dagger2-android (不是dagger2)使用

dagger2-android

qq8803128的博客 524

Android Dagger2 原理深度剖析

Dagger2 是 Google 开源的一个依赖注入框架,它在 Android 开发中得到了广泛的应用。与其他依赖注入框架(如 Guice)不同,Dagger2 是一个基于编译时注解处理器的框架,它在编译时生成依赖注入的代码,避免了运行时反射带来的性能开销。Dagger2 的核心概念包括@Inject@Module@Provides和@Component等注解。@Inject注解用于标记需要注入的对象或构造函数;@Module注解用于标记一个类为模块类,模块类中可以包含多个使用@Provides。

Android开发领域创作者 1329

Dagger 2 完全解析(六),dagger.android 扩展库的使用

Dagger 2 完全解析系列:Dagger 2 完全解析(一),Dagger 2 的基本使用与原理Dagger 2 完全解析(二),进阶使用 Lazy、Qualifier、Scope 等Dagger 2 完全解析(三),Component 的组织关系与 SubComponentDagger 2 完全解析(四),Android 中使用 Dagger 2Dagger 2 完全解析(五),Kotlin...

晨光飞舞的专栏 703

2024年Android最全架构进阶,Dagger2的原理及使用详解(2),2024年最新997页手淘Android面试真题解析火爆全网

**@作者 : Android架构@创建日期 :2017/7/14 下午3:04@方法作用:参考Singleton 的写法Scope 标注是ScopeDocumented 标记在文档@Retention(RUNTIME) 运行时级别*/@Scope首先想一下,什么样的对象,能够做到全局单例,生命周期肯定和APP 绑定嘛,这里我做演示,一个AppAip 我们要对这个对象,全局单利,所以二话不说,先给Application 来个全家桶,Module@Module。

2401_84563875的博客 964

dagger android,Dagger2 系列(三)Dagger2.Android使用详解

前言前两篇文章我们介绍了dagger2的使用和基本原理,为了适用于android项目代码特点,更简洁的实现四大组件和Fragment的注入,dagger2团队为我们又进一步的封装,也就是我们要介绍的dagger2.android。对dagger2原理和使用不了解的朋友先移步看前两篇文章。dagger2.android 产生的意义上篇文章讲到了component的继承和依赖实现方式,在实际andro...

weixin_30104235的博客 447
上一篇: Dagger 2 完全解析(三),Component 的组织关系与 SubComponent
下一篇: Dagger 2 完全解析(五),Kotlin 中使用 Dagger 2
candyguy242
博客等级 码龄17年 63粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值