Dagger2实现依赖注入之一步一步带你入门

Android Dagger 2:优雅依赖注入的终极指南(附源代码和详细讲解) Dagger 2是一个强大的依赖注入框架,可以帮助我们实现模块化、可测试和可维护的代码。本文对Dagger 2的基本概念、核心组件和示例代码进行了详细的介绍,希望可以帮助读者更好地理解和应用Dagger 2。而Dagger 2是一个强大的依赖注入框架,它可以帮助我们实现模块化、可测试和可维护的代码。Dagger 2是由Google开发的依赖注入框架,它利用Java和Java注解处理器的强大功能,提供了一种优雅的方式来进行依赖注入。:用于标记一个类为Dagger 2的模块,模块负责提供依赖对象的实例。 阅读详情
一、首先你要知道什么是依赖?

想要理解Dagger2,首先你要理解一个概念,就是什么是依赖,懂的同学可以省过此段。这里给大家举个通俗易懂的例子,让你秒懂什么是依赖,你今天去办港澳通行证,出入境告诉你想办理这个证你要携带你的个人身份证和户口本,不然不给你办,这个时候就产生了一个依赖关系,通行证的办理需要依赖身份证和户口本,我们就想到用代码实现可以如下。

     
     class PassPort{

            private IDCardBean mIDCard;
            private FamilyRegisterBean mFamilyRegister;

            public PassPort(){
                this.mIDCard = new IDCardBean();
                this.mFamilyRegister = new FamilyRegisterBean();
            }
        }


或者

    
    class PassPort{

        private IDCardBean mIDCard;
        private FamilyRegisterBean mFamilyRegister;

        public PassPort(IDCardBean mIDCard, FamilyRegisterBean mFamilyRegister){
            this.mIDCard = mIDCard;
            this.mFamilyRegister = mFamilyRegister;
        }
    }

    IDCardBean mCard = new IDCardBean();
    FamilyRegisterBean mFR = new FamilyRegisterBean();

    PassPort mPassPort = new PassPort(mCard, mFR);
 }


上面两段代码咋一看没啥毛病,但是如果现在我告诉你,你去办理身份证也同时需要带户口本还有身份证照片回执等,办理户口本还需要各种证明等,那么这个时候 IDCardBean 和 FamilyRegisterBean 的构造函数是不是也要相应地做出改变,而通行证 PassPort 的代码是不是也要做出修改,这时就有人说了,没事啊我可以改,那么如果你项目中有一百个地方都用到了呢,你是不是都要逐个逐个去改呢?为了不需要改动太多地方,我们必须给通行证和身份证、户口本进行降耦。

二、知道依赖的概念后,你要知道Dagger2是个什么东西

从上面的例子可以看出,如果按照我们日常的编码习惯,如果存在依赖关系的某一处有一些小修改,都可能会给代码量大的项目造成很大的改动,这样是不符合工程思想的,所以就出现了各种依赖注入框架,Dagger2就是其中的一个,它的前身是Dagger1,Dagger1是由Square公司开发的,而Dagger2却是由谷歌公司接手开发,两者还是存在一些区别的,不过这篇文章不会做太多介绍,主要还是教会大家如何使用Dagger2。


三、初步了解Dagger2后,你需要知道几个重要的概念

在正式使用Dagger2之前,你需要了解以下几个重要的注解,为了方便大家的理解,我会用最通俗的话来解释,如果想知道更多的可以查看官方文档。

1、 @Inject:目标类用这个注解修饰的一些方法或者属性(字段),说明这个目标类需要这个依赖,比如上面例子中就可以在身份证字段和户口本字段上加上这个注解

2、 @Module:用这个注解修饰的类说明是一个提供依赖的类,比如我们可以把通行证的依赖身份证和户口本一起放在用这个注解修饰的类中

3、 @Provide:这个注解主要用来修饰 @Module 修饰的类中的方法

4、 @Component:这个是把 @Inject 和 @Module 关联在一起的桥梁

5、 @Scope:作用域

四、你需要知道Dagger2的使用步骤

1、定义所需要的bean,比如前面的 PassPort 、IDCardBean 之类的,然后在需要注入依赖的地方标上 @Inject 注解。

2、定义一个类,命名为 XXXModule ,比如 PassPortModule,用 @Module 注解这个类。

3、在PassPortModule 这个类中定义你需要提供依赖的方法,这些方法名一般为 provideXXX,而且要用 @Provides 来注解,方法体就是 new 一个依赖实例,比如 new 一个 IDCardBean 实例。

4、创建一个接口,一般命名为 XXXComponent,接口要用 @Component 注解,并需要传入相应的 module 参数,例如 @ Component(modules = PassPortModule.class),另外需要提供一个注入方法,一般写成 void inject(目标类 tmp),比如 void inject(PassPort passPort)

五、开始上代码

1、在根项目(project)的 build.gradle 中添加以下代码,为了添加 apt 插件
    
    dependencies {
          
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
           
    }


2、在 app (module) 的 build.gradle 中添加以下代码
    
    dependencies {
          
        apt 'com.google.dagger:dagger-compiler:2.6'
        compile 'com.google.dagger:dagger:2.6'
           
    }


注意上面两个步骤的版本可能会有所不一样。

3、定义PassPortActivity,并在需要依赖的属性上用 @Inject 注解
    
    public class PassPortActivity extends BaseActivity{

        @Inject
        IDCardBean mIDCard;

        @Inject
        FamilyRegisterBean mFamilyRegister;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(getContentViewId());

        }

    }


4、定义 PassPortModule,并用 @Module 注解这个类,类里面写上提供依赖的方法,方法用@Provides注解,方法体则是 new 出依赖实例
    
    @Module
    public class PassPortModule {

        private final PassPortActivity mView;

        public PassPortModule(PassPortActivity view) {
            this.mView = view;
        }

        @PerActivity
        @Provides
        public IDCardBean provideIDCard() {
            return new IDCardBean(mView);
        }

        @PerActivity
        @Provides
        public FamilyRegisterBean provideFamilyRegister() {
            return new FamilyRegisterBean(mView);
        }

    }

5、定义PassPort Component
    
    @PerActivity
    @Component(dependencies = ApplicationComponent.class, modules = PassPortModule.class)
    public interface PassPortComponent { 

        void inject(PassPortActivity activity);

    }


6、这个时候依赖关系就已经建立好了,你需要重新编译一下你的工程,Android studio 的快捷键是 ctrl+f9

7、在你 onCreate 方法里面添加以下代码
    
    DaggerPassPortComponent.builder()
                    .applicationComponent(getAppComponent())
                    .passPortModule(new PassPortModule(this))
                    .build()
                    .inject(this);


到现在,你已经会Dagger2的基本使用了,这里说明一下,如果你没进行第6个步骤,或者这个步骤中编译出错,那么你是无法进行到第七步的,因为这篇文章只讲解Dagger2的基础使用,有兴趣深入了解的可以期待下我的另一篇文章 Dagger2实现依赖注入之深入探究,我会带着大家看下Dagger2生成的代码中是如何工作的。



ROS2仿真抓取分拣案例,使用myCobot 280机械臂结合ROS2系统搭建机械分拣站 本案例展示了如何利用myCobot 280 urdf模型构建一个对象分类站,并在ROS2 jazzy中完成运动规划。 阅读详情

相关推荐

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1968

Dagger 注入的简单原理

最简单的使用步骤: 声明一个 Module @Module public class MainModule { @Provides Dog provideDog(){ return new Dog("bob"); } } 复制代码声明一个 Component 表明要把哪个 module 注入到哪些对象,如下表示把 MainModule 注入到 MainA...

weixin_33895475的博客 249

“挑战杯”大赛“揭榜挂帅”赛道-baseline解析

在这个脚本中,txt文件的保存路径为'yolov7/datasets/Fatigue_driving_detection/txt_labels/',而xml文件的路径为'./label_xml/'。标注图片后的产物是会给每一个图片对应生成一个xml格式的文件,但是如果要用yolo框架去训练模型,输入的数据必须是txt格式,因此这里有一步转换格式的过程。注意看:obs这里有三个文件夹,第一个是关键帧的文件夹A,第二个是标注时输出的位置为文件夹B,第三个是智能标注后和手动标注的合集文件夹C。

m0_62899814的博客 2321

【Android】Dagger2从入门到再入门

一.认识Dagger2Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagger1 由Square公司开发。依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性。年初的时候就已经接触到dagger2,当时只是看了几篇博文,简单的了解了下,记得当初的感觉也是云里雾里,并未真正的理解dagger,时隔几个月,再次学习它,对dagger有了新的认识,在此作下记录;

风吹起如花般细碎流年 1022

【网格生成】Gmsh快速入门教程 --1.图形化界面使用

初探 Gmsh软件的主界面如下图所示。通过点击菜单“File” -> "Open"可选择打开已经存在的几何模型或网格文件,初次使用可选择tutorial目录下的t1.geo文件。打开后效果如图所示,t1.geo描述的是一个长方体。 接下来依次尝试左侧菜单栏的功能:Geometry(几何)、Mesh(求解器)。Solver模块需依赖外置求解器,不在本文介绍范围内。 Geometry 该菜单下是与几何相关的功能,如新增一个点/面、体,移动一个体等,具体功能很多可以在后续使用中逐渐尝试学习。本文仅介绍几个

DJ_xiaoming的博客 1万+

一文搞懂雷达脉冲压缩和匹配滤波器

为了解决传统单频脉冲雷达面临的作用距离和空间分辨力之间的矛盾,脉冲压缩理论被提出。在接收端设计一个和发射信号能够“共轭匹配”的网络来实现脉冲压缩。接收到的回波信号通过匹配滤波器时,滤波器的增益在信号越强的频率点越大;在信号越弱的频率点,增益越小,通过这样的方式使信号在时域更加集中。脉冲压缩技术大致可分为线性调频(LFM)和相位编码。其中LFM信号易于通过硬件或各种技术产生,但是进行匹配滤波后主旁瓣比高达13.2dB,在检测多个目标时,强目标的回波旁瓣可能会把弱小信号覆盖,导致弱小信号的检测受到影响。

FPGA入门到跑路 9934

依赖注入框架-Dagger2 精炼详解

一、前期基础知识储备 1)依赖注入是什么? 依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的。 我们使用各种依赖注入框架比如View注入框架Butternife,Koltin注入框架kodein,更加简易的RoboGuice注入框架等等,都是为了降低类与类之间的耦合。实现依赖注入的方法通常有三种:①构造方法注入;②定义set方法注入;③注解注入。...

Chin_Style的博客 1075

量化交易新手必看:如何用vnpy+Tushare轻松获取A股历史数据(附完整代码)

本文为量化交易新手提供了使用vnpy和Tushare构建A股历史数据获取系统的完整指南。通过详细的代码示例,手把手教你搭建环境、封装数据获取引擎,并实现日线等数据的格式转换与本地存储,为策略回测与分析奠定坚实的数据基础。

weixin_29098117的博客 378

dagger2 入门指南ATM

dagger2 官方入门指南

guchuanhang的专栏 504

Python爬虫教程:微博热点话题抓取与社交媒体分析

微博是中国最大的社交媒体平台之一,拥有海量的用户和丰富的讨论话题。通过爬取微博的热门话题和讨论内容,我们可以深入分析用户的兴趣、舆论走势、社会情绪等。通过爬取微博的热点话题和讨论内容,我们可以获得关于当前热门话题的宝贵数据,并基于这些数据进行多种社交媒体分析。本文将通过Python爬虫技术,详细介绍如何抓取微博上的热门话题、话题讨论内容,并进行社交媒体分析。希望本文为你提供了一个全面的微博数据抓取与分析的指南,帮助你在社交媒体数据分析的道路上迈出坚实的第一步。微博上的一些页面内容是静态的,可以直接通过。

2201_76125261的博客 589

45、使用 sqlread 函数将数据从数据库表导入 MATLAB

本文详细介绍了如何使用 MATLAB 中的 `sqlread` 函数从不同类型的数据库(如 Microsoft SQL Server 和 SQLite)中导入数据。文章涵盖了 `sqlread` 的基本语法、输入输出参数、使用示例以及注意事项,并通过多个实例演示了自定义导入选项、元信息检索和数据类型转换等内容。此外,还总结了导入数据库数据的通用流程及最佳实践建议,帮助用户更高效地进行数据分析和处理工作。

bash7scripter的博客 133

你还停留在使用Dagger2吗? 带你一步一步走进Dagger2的世界

Dagger2是一个依赖注入框架 1.什么是依赖注入? 就是目标类中所依赖的其他的类的初始化过程,不是通过手动编码的方式创建 将其他的类初始化好的实例自动注入到我们的目标类当中。它也是面向对象的一种设计模式, 主要作用就是降低我们程序的耦合。 讲述两个场景来描述一下Dagger2: 1.在一个对象里创建另一个对象的实例。这种行为就会产生耦合现象。导致代码难以维护。 2.Picasso...

wk_先森的博客 2万+

Python 中 dpkt 库的详细使用指南(强大的 Python 数据包解析库)

dpkt 是一个功能强大的 Python 网络数据包解析库,支持解析和构造以太网、IP、TCP/UDP 等多种协议的数据包。其核心功能包括解析各层协议头部、读写 pcap 文件、构造自定义数据包及分析 HTTP 流量等。dpkt 提供简单易用的 API,适用于网络分析、安全研究和流量监控场景。优化技巧包括数据包过滤、批量处理和选择性解析以提高性能,常见问题如数据不完整或协议识别错误可通过异常处理和字段验证解决。典型应用场景涵盖协议分析、网络调试和自定义数据包生成。

数据知道的博客 1万+

最简单的Dagger2入门教程

在上一篇博客中总结了依赖注入的原理与实现方式。 依赖注入的原理 依赖注入就是将调用者需要的另一个对象实例不在调用者内部实现,而是通过一定的方式从外部传入实例,解决了各个类之间的耦合。那么这个外部,到底指的是哪里,如果指的是另一个类,那么,另一个类内部不就耦合了。能不能有一种方式,将这些构造的对象放到一个容器中,具体需要哪个实例时,就从这个容器中取就行了。那么,类的实例和使用就不在有联系了,而是通过一

茅屋 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

一步一步带你写一个dagger2的Demo

1.MVP模式简介 我们的目标是实现MVP模式来开发我们的应用,那首先得知道什么是MVP模式。下面这篇文章讲述得通俗易懂,非常适合新手学习。MVP模式简单易懂介绍 这里简单讲一下, M ----  model,即数据层 V ----  view,即界面层比如我们的Activity和Fragment P ---- presenter, 即业务层,我个人觉得更像是管理层。管理数据如何显示,管

javine的专栏 3524

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

“一盘沙拉”带你入门Dagger2(一)之HelloWorld

系列文章“一盘沙拉”带你入门Dagger2(一)之HelloWorld“一盘沙拉”带你入门Dagger2(二)之带参数怎么办“一盘沙拉”带你入门Dagger2(三)之@Qualifier“一盘沙拉”带你入门Dagger2(四)之 @Singleton“一盘沙拉”带你入门Dagger2(五)之 @Scope引子使用Dagger2这个框架,可以高效的在Android(java)中实现“依赖注入”。什么是

Android_Study_OK的博客 3733

由浅入深,带你一步步走进Dagger2

由浅入深,带你一步步走进Dagger2

huxin1875的博客 2142

Dagger2实现依赖注入之深入探究

上一篇文章Dagger2实现依赖注入之一步一步带你入门已经和大家分享了Dagger2的基本使用,如果你还没学会,可以边看文章边自己操作一遍。 上次说到,第六个步骤需要我们自己去重新编译一下项目,不然是无法执行最后一步的,也就是添加以下代码。 DaggerPassPortComponent.builder() .applicationCo

Interface_l的博客 746

Dagger2——DI依赖注入——IOC原则的实现者

《如何获得完全松耦合的程序设计》 IoC原则、DIP原则、DI设计模式可以帮助我们获得完全松耦合的程序设计。而Dagger2则是实现了依赖注入(DI)设计模式的框架,也就是它实现了IoC原则。 简而言之,Dagger2在遵循IoC原则下帮助我们创建依赖对象。我大概讲一下DI设计模式:比说A类依赖B类,那么我们通过在A类外面创建B类的对象,再将其注入A类。需要有个第三方帮我们把这件事做了(IoC的体现),那么Dagger2就是这个第三方。 Dagger2是基于java规范要求,使用注解的方式生成代码。我们通过

weixin_40763897的博客 2107

如何用Dagger 2在Kotlin Android应用中实现依赖注入:基于PhotoAffix的完整教程

PhotoAffix 是一款用 Kotlin 编写的 Android 照片拼接应用,它将 Dagger 2 依赖注入框架运用得恰到好处:通过 1 个 AppComponent 和 5 个 Module,把图片引擎、用户偏好、协程调度器等依赖自动装配到界面层。这篇完整教程带你从核心概念到实战源码,快速掌握 Dagger 2 依赖注入的全部用法。 [![PhotoAffix Android 照片拼接

gitblog_00726的博客 971

一文看懂依赖注入(Dagger2)

一句话解释依赖注入(DI)的作用,就是。

weixin_51020083的博客 983

依赖注入框架Dagger2—1.入门

1.依赖注入 1.1.什么是依赖? 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。 例如下面类 A 中用到一个 B 对象,我们就说类 A 对类 B 有一个依赖。 同时,这也是一个典型的"依赖非注入"案例。 public class A { ... B b; .

点滴积累 545

Dagger2这次入门就不用放弃了

Dagger2入门教程。

郭霖 1555

android dagger2 讲解,用Dagger2在Android中实现依赖注入

依赖注入这个模式(模式已经用烂了,这里再烂一次)是用来给应用的各部分解耦的。使应用开发更加可扩展,更容易维护。通过本文你会学到如何使用Dagger2来处理依赖。简介如果以对象需要另外的一个对象才能完成一个完整功能的话,那么这里就存在一个依赖。比如,悟空要用金箍棒才能三打白骨精,要筋斗云才能十万八千里。悟空有对金箍棒和筋斗云的依赖。你可以在悟空对象里初始化金箍棒,也可以用一个工厂方法批量生产金箍棒。...

weixin_30877689的博客 368

用 Dagger 2 实现依赖注入

Dagger 2 为你解析这些依赖,并生成把它们绑定在一起的代码。也有很多其它的 Java 依赖注入框架,但它们中大多数是有缺陷的,比如依赖 XML,需要在运行时验证依赖,或者在起始时造成性能负担。 Dagger 2 纯粹依赖于 Java 注解解析器以及编译时检查来分析并验证依赖。它被认为是目前最高效的依赖注入框架之一。

Treasure 287

Dagger2 依赖注入的原理分析

Dagger2 依赖注入的原理分析 因为 Dagger2 的使用情况很多,这里只对基本的使用方法进行分析。 以一个简单依赖注入举例如下: 创建 Watch 类如下: public class Watch { public Watch() { } public String work() { return "work"; } } 创建 Watc...

okclouderx的博客 451

Andriod Dagger2依赖注入

Android Dagger前言:学习Dagger首先要了解什么是依赖注入(Dependency Injection),为什么需要依赖注入,了解这些以后就可以进入Dagger的学习,现在大部分的项目都在使用Dagger2,我们先就Dagger2进行学习,慢慢了解注入的机制。what and why(Dependency Injection)what:依赖注入(DI):就好比一个人去淘宝买一件衣服,他

L_bsSua的博客 441
上一篇: Android Activity 之横竖屏的生命周期
下一篇: Dagger2实现依赖注入之深入探究
Interface_l
博客等级 码龄12年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值