Dagger2 到底能为我们做些什么 源码解析

举报
半身风雪 发表于 2022/06/30 10:10:07 2022/06/30
【摘要】 @TOC 前言在文章开始之前,我们先来了解一下什么是Dagger21、Dagger2 是 Dagger 的升级版,是一个依赖注入的框架。2、Dagger2 的主要作用就是解耦,降低代码的耦合度,依赖注入是面向对象的一种设计模式,其目的就是为了降低程序耦合度。3、隔离,相当于对对象进行了封装包裹管理,发生变换的只有一个地方4、之前模式(目标要去管理类,和类产生关系),Dagger2 (目标 和...

@TOC


前言

在文章开始之前,我们先来了解一下什么是Dagger2

1、Dagger2 是 Dagger 的升级版,是一个依赖注入的框架。
2、Dagger2 的主要作用就是解耦,降低代码的耦合度,依赖注入是面向对象的一种设计模式,其目的就是为了降低程序耦合度。
3、隔离,相当于对对象进行了封装包裹管理,发生变换的只有一个地方
4、之前模式(目标要去管理类,和类产生关系),Dagger2 (目标 和 对象 都需要交给Dagger 来管理)
5、由Dagger 统一管理了,内存释放什么的,都由Dagger 去控制(grill 再也不用担心泄漏的问题了)

大厂 公司用的非常多

在这里插入图片描述


一、为什么要用Dagger2

1、Butterknife 与 Dagger 2的区别

1、Butterknife 目的为视图绑定,绑定到inflate的views 里面(目前已经被淘汰了哈)
2、Dagger2 目的为能够注入到任何你想要的对象;
3、Dagger2 可以降低(程序中对象的)耦合度(依赖注入)

2、IOC 控制反转

IOC (Inversion of Control)是原来由程序代码中主动获取的资源,转变由第三方获取并使原来的代码被动接收的方式,以达到解耦的效果,称为控制反转。

这里来张图哈,说白了,IOC 就相当于一个保姆,你想要干哈,直接告诉保姆呗
在这里插入图片描述

二、Dagger2 使用篇

1、导入Dagger2

//noinspection GradleDependency
implementation 'com.google.dagger:dagger:2.41' // 导入API 支持,包括注解
annotationProcessor 'com.google.dagger:dagger-compiler:2.41' // 使用Dagger2 的注解处理器APT

2、示例演示

下面我们看张生活中的图:👓👓👓

在这里插入图片描述

很简单的一张图呢,我们买了商品,商品经过打包,快递员拿到包裹,直接送到你的手上。Goods -> GoodsModule -> GoodsComponent -> activity 整个流程是不是清晰了很多呢?

/**
 * 商品类
 */
public class Goods {

    Goods(){}

}

/**
 * 包裹类
 */

@Module
public class GoodsModule {

//    暴露我们的商品
    @Provides
    public Goods getGoods(){
        return new Goods();
    }
}

/**
 * 快递接口
 */

@Component(modules = GoodsModule.class)
public interface GoodsComponent {

    void injectMainActivity(MainActivity activity);
}

public class MainActivity extends AppCompatActivity {


    @Inject
    Goods goods;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // DaggerGoodsComponent.create().injectMainActivity(this);  这种方式基本不会使用
DaggerGoodsComponent.builder()
                .goodsModule(new GoodsModule())
                .build()
                .injectMainActivity(this);

        Toast.makeText(this, ""+ goods.hashCode(), Toast.LENGTH_SHORT).show();

    }
}

总结

看了上面的代码,有没有发现,代码简单了很多呢?我们告别了传统 Goods goods = new Goods() 的代码,大大的降低了代码的耦合度,只需要在需要使用的地方,使用一个注解 @Inject 就可以直接调用了。以后我们也可以这样写代码的话,能不能升职加薪,迎娶白富美呢。当然不是咯,现在Dagger2 基本上已经被淘汰了,为什么呢?因为还是太难用呗

㊙㊙㊙下一节,我们讲解 jetpack 中的 hilt 它是基于Dagger2 的二次封装

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。