将Android进行到底之Dagger2(一)

本文介绍了Dagger2这一依赖注入框架在Android开发中的应用,通过示例详细阐述了依赖注入的概念、IOC原理以及Dagger2的使用步骤,包括构造方法和setter方法的依赖注入,帮助开发者理解如何降低类之间的耦合度,提升程序性能。

系列文章目录

将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,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

职场007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值