系列文章目录
将Android进行到底之Dagger2(二)
将Android进行到底之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依赖:
如下所示:
//引如Dagger2
implementation('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 {
@Inject
public 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的对象了,在程序中直接使用就可以啦
@Inject
User mUser;
@Override
protected 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,敬请期待。
本文介绍了Dagger2这一依赖注入框架在Android开发中的应用,通过示例详细阐述了依赖注入的概念、IOC原理以及Dagger2的使用步骤,包括构造方法和setter方法的依赖注入,帮助开发者理解如何降低类之间的耦合度,提升程序性能。
&spm=1001.2101.3001.5002&articleId=126217458&d=1&t=3&u=a99012104f974b26a31cb721a235bc6d)
421

被折叠的 条评论
为什么被折叠?



