将Android进行到底之Dagger2(一)
系列文章目录
将Android进行到底之Dagger2(二)
将Android进行到底之Dagger2(三)
文章目录
- 系列文章目录
- 前言
- 一、什么是依赖注入?
- 二、IOC与Dagger2
- 1.IOC
- 2.Dagger2
- 三、Dagger2使用步骤
- 总结
前言
当前我们开发软件大多都是使用面向对象的思想。将我们想要操作的对象抽象成类,使用的时候再根据类实例化出我们想要操作的对象,再通过对这些对象的管理和组合操作,最终形成咱们想要的软件。而一个软件是否优秀就取决于对组成软件对各个对象的管理和组合是否合理。有时候完成一个操作可能需要几个对象之间一起配合,比如造一辆汽车,需要有引擎对象、轮子对象、玻璃对象等一起组成,而汽车要走又需要引擎和轮子以及其他部件配合,不能是引擎没启动,轮子就转动跑了吧。而对象之间的这种联系,可以称为耦合关系,简单理解就是两个类之间有关联关系。这种关系在软件系统中我们希望越小越好。也即是迪米特法制,通俗讲就是“只和朋友交谈,不和陌生人说话”。不能为了完成一个功能,让很多类都关联到了一起,这样不仅增加了系统的复杂度,同时也会导致系统难以扩展,因为修改一处,与其有关联的地方都得修改。本章会先讲Dagger2。下面进入正题吧。
一、什么是依赖注入?
依赖注入其实我们写Java软件开发的人都使用过,只是咱们没有注意到而已,看了下面的例子,保证你会恍然大悟:
如下所示
public class Car {private Engine mEngine;public Car(){//直接new的方式比较不合理,万一修改了Engine类,那么会//引起大面积的修改Engine engine = new Engine();}//构造方法注入依赖public Car(Engine engine){this.mEngine = engine;}//函数注入依赖public void setEngine(Engine engine){this.mEngine = engine;}
}
拿烂大街的例子Car类来举例,Car和Engine之间需要建立一个依赖关系,我们可以直接在构造函数中创建Engine对象,但是这样不推荐,这样会导致Car和Engine的耦合,假如Engine变了,那么Car类以及相关类都得修改。
所以就有了构造方法注入依赖和set方法注入依赖,是不是感觉自己都用过,这种就是依赖注入。
二、IOC与Dagger2
1.IOC
相信大家都听说过IOC和依赖注入吧,IOC即控制反转和依赖注入其实是同一个东西,具体的读者可以去百度这两个概念,这里不做详述。IOC和依赖注入其实就是一个工具,使用它可以让我们省去很多创建对象的模版代码和降低类之间的耦合度。IOC有两种实现方式:
(1)基于反射实现:具有代表性的就是Spring IOC,利用反射动态进行依赖关系建立
(2)基于静态方式实现:具有代表性的就是Dagger2,即程序在依赖时就已经提供了建立关系的类。
2.Dagger2
有一定开发经验的读者一定使用过View的依赖注入框架黄油刀,这个工具省去了我们写大量的findViewById的代码。让类看起来更加清爽。而今天要说的Dagger2也是一个依赖注入的框架,使用它可以省去我们写大量的A a = new A()
这样的代码,并且可以实现单例的效果,提升程序性能。
三、Dagger2使用步骤
1.新建一个项目后在App的module中的build.gradle文件中引入Dagger2依赖:
如下所示:
//引如Dagger2implementation('com.google.dagger:dagger:2.42')annotationProcessor('com.google.dagger:dagger-compiler:2.42')//为了演示创建第三方框架中的对象引入implementation('com.squareup.retrofit2:retrofit:2.9.0')implementation('com.squareup.retrofit2:converter-gson:2.9.0')implementation('com.squareup.retrofit2:converter-scalars:2.9.0')
为了演示利用dagger2创建第三方框架的对象,引入了Retrofit依赖
2.新建一个User类,使用@Inject注解在构造函方法上,告知Dagger可以通过构造方法创建并获取到User实例对象。
代码如下:
public class User {@Injectpublic User(){}
}
3.新建一个ApplicationComponent接口,并使用@Component注解它,提供一个inject(MainActivity mainActivity)
方法供调用类注入。这个地方的调用者咱们定为MainActivity
如下所示:
@Component
public interface ApplicationComponent {void inject(MainActivity mainActivity);
}
4.在MainActivity中使用Dagger2的注解获取到对象,我们准备完上门的步骤后,可以下clean下项目,再rebuild下项目,然后在MainActivity中使用生成的DaggerApplicationComponent来将MainActivity设置给ApplicationComponent,这样就可以使用注解生成对象了。
如下所示
public class MainActivity extends AppCompatActivity {//使用 @Inject注解后,就可以拿到User的对象了,在程序中直接使用就可以啦@InjectUser mUser;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//执行注入动作DaggerApplicationComponent.create().inject(this);Log.d("zhongxj:", "User: " + mUser.toString());}}
运行结果:
可以看到咱们的User对象已经成功拿到了。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了IOC的理解和Dagger2的使用,防止文章太长引起读者阅读疲劳,所以打算分成多篇文章讲解Dagger2和hilt,敬请期待。
将Android进行到底之Dagger2(一)相关推荐
- Android 系统到底提供了哪些东西,供我们可以开发出优秀的应用程序(文末送书)
Android 系统到底提供了哪些东西,供我们可以开发出优秀的应用程序. 作者:坚果 公众号:"大前端之旅" 华为云享专家,InfoQ签约作者,阿里云专家博主,51CTO博客首席体 ...
- Android 依赖注入框架 Dagger2使用
前言 Dagger 2这个匕首确实很难上手,上手后又比较难瞬间掌握,可以这么说,刚开始使用就是用来尝(zhuang)鲜(X)的,但相信随着使用的加深,会不断体会到它对于整个项目架构的极强辅助作用,能使 ...
- dagger android,在Android开发中使用Dagger2的方法
在Android开发中使用Dagger2的方法 发布时间:2020-12-08 17:12:38 来源:亿速云 阅读:236 作者:Leah 在Android开发中使用Dagger2的方法?相信很多没 ...
- android mm 到底执行了什么?
android mm 到底执行了什么? ---------------------------------------- author: hjjdebug date: 2015年 05月 08日 ...
- Android注解使用之Dagger2实现项目依赖关系解耦
Dagger2 一句话:一款快速的注解框架,应用于Android.Java,由 Google 开发和维护,是 Square 的 Dagger 项目的分支. gitHub:https://github. ...
- Android Context 到底是什么?
什么是Android Context? 一个Context意味着一个场景,一个场景就是我们和软件进行交互的一个过程.比如和妹纸约会的月下小桥,比如当你使用微信的时候,场景包括聊天界面.通讯录.朋友圈, ...
- Android面试基础技能罗列,谈谈我认为的高级Android开发到底应该是怎样的
前言 对于字节跳动的二面三面而言,Framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等问题都成高频问点!然而很多的朋友在面试时却答不上或者答不全!今天在这分享下这些 ...
- Android 依赖注入 DI - Dagger2
1.依赖注入 (Dependency Injection) 1.1 面向接口编程 public interface Drivable {void drive(); }public class Bike ...
- volatile关键字在Android中到底有什么用?
本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新. 上周六在公众号分享了一篇关于Java volatile关键字的文章,发布之后有朋友在留言里指 ...
最新文章
- win下ubuntu安装mysql_MySQL在Win10与Ubuntu下的安装与配置
- 查看当前svn账户_SVN-基础教程学习
- 学以致用一:得到数组的最后一个元素。
- try catch 自定义捕获异常
- libevent源码学习-----事件驱动流程分析
- Linux如何查看所有用户和用户组信息(cat groups whoami)
- 深度学习目标检测系列:faster RCNN实现|附python源码
- 【BZOJ2705】Longge的问题,数论练习
- 最简单的List集合排序方法
- .Net之路(四)利用DataTable、DataSet返回SQL Server的表或者单个字段
- redis命令行技术文档。命令教程
- 分享5个最好的在线wap浏览器|wap浏览器软件
- 黄素单核苷酸小麦麦清白蛋白纳米粒|石杉碱甲乳清白蛋白纳米粒Huperzine-whey protein|化学试剂
- node文件系统 常用文件处理方法
- 基于SVM算法的股票预测分析
- 英汉小字典java_java 学习案例之英汉字典
- 修复wordpress安装buddypress插件后的警告
- launch 文件中remap标签的使用
- led驱动程序_点亮led(imx6ull)
- java导出excel限制大小_解决java poi导出excel2003不能超过65536行的问题