热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

无法理解匕首依赖注入概念-在Android上的Dagger2

如何解决《无法理解匕首依赖注入概念-在Android上的Dagger2》经验,为你挑选了1个好方法。

我想了解dagger2并在我的应用程序中实现.我已经阅读了很多关于它的好处.除非我完全理解,否则我无法在我的应用中获得它的好处.

我已经理解了@Module和@Inject.令我困惑的是@Component.我几乎没有相关的问题.

    Module提供对象实例,Inject使用它.为什么我们之间需要组件?是否真的有必要缩小差距?我们可以使用没有任何方法的空接口组件吗?

    构造函数对于模块类是否真的必要?如果模块类中没有构造函数,我们可以使用空构造函数初始化模块类吗?

    为什么我们不能直接实例化模块类并构建依赖图而不是创建组件然后初始化它?

    到目前为止,我在组件接口中只看到了两种方法

    一个.void inject(活动/服务/片段); - 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -

    void inject(); - 组件是否仍会生成依赖图?

    我们可以从活动或服务以外的其他类注入或者像这样的片段 -

    void inject(DataManager dataManager);

    如果DataManager是单例实例怎么办?

    湾 改造getRetrofit(); 这种方法和上面的方法有什么区别?为什么不采用任何输入参数?

    我读到@Singleton只是匕首的范围.我们怎样才能真正创建一个在应用程序的生命周期内存在的单例对象?

    假设我想使用dagger构建一个DataManager实例.它只有一个依赖.我为此编写了一个模块类和一个组件接口.如果我想在MainActivity中使用它,我会用它作为

    @Inject DataManager dataManager;

    ...

    @覆盖

    protected void onCreate(Bundle savedInstanceState){

    DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();

    }

    我想在许多其他活动中使用这个数据管理器,我不希望它是单例.我想将它保持在我使用它的当前活动范围.所以我会用

    @Inject DataManager dataManager;

    得到那个实例.我应该写

    DataManagerComponent.Builder...........
    

    在每个活动oncreate()我使用@Inject DataManager dataManager?如果我必须写它,它不会创建更多的样板代码而不是简单地使用

    DataManager dataManager = new DataManager();

    假设有4个对象,它们相互依赖,如D依赖于C,C依赖于B等.

    D - > C - > B - > A.

    让我们假设我已经编写了模块类并为所有4提供了方法.如果我尝试在任何ActivityA中注入D

    @Inject D d;

    C,B,A会自动实例化吗?

    让我们假设在ActivityB中我只需要注入B.如果我注入B就好了

    @Inject B b;

    匕首会再创造B和A吗?或者它会使用已经创建的那些?

如果有人花时间回答我的所有问题,我感激不尽.我不指望详细的答案.如果澄清这个概念就好了.期待着回应.提前致谢.



1> 小智..:

这感觉更像是勺子喂食.我会尽力给你尽可能多的信息.

1 - > Module提供对象实例,Inject使用它.为什么我们之间需要组件?是否真的有必要缩小差距?Interface没有任何方法我们可以有空组件吗?

良好代码的基本原则之一是; 坚固.这给我们带来编码到界面的原则在SOL .D. Dagger组件是interfaces它会boilerplate code为您生成的; 它还可以帮助我记录我的对象图.

2 - > constructor对模块类真的有必要吗?如果constructor模块类中没有,我们可以使用空初始化模块类constructor吗? 在模块类中,constructor主要用于外部依赖项.你可以选择不拥有一个.在这里你可以打电话给你的组件并直接说MyComponent.create()

3 - > 为什么我们不能直接实例化模块类并构建依赖图而不是创建组件然后初始化它? 这就像不使用dagger.在依赖注入开始之前,开发人员仍然可以遵循SOLID原则.但是使用Dagger类似的框架它迫使开发人员考虑解耦实现.

4 a - >*void inject(Activity/Service/Fragment);- 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -

void inject(); - Will the component still generate dependency graph?

我们可以从活动或服务以外的其他类注入或者像这样的片段 -

void inject(DataManager dataManager);

如果DataManagersingleton instance?*

你需要提到目标Dagger.它不可能interface,Object可能singleton没关系.

4 b - > Retrofit getRetrofit();这种方法和上述方法有什么区别?为什么不采用任何输入参数? 这是组件的定义.如果您使用构造函数注入,并且如果您更改输入参数的数量,则表示您不必每次都更改代码.Dagger会照顾它.上面的代码我认为是组件定义的一部分,所以当你做组件依赖时,它将帮助你将它暴露给外层图

5 - > 我读到@Singleton的只是一个范围dagger.我们如何才能真正创建一个singleton object终身应用程序的生命? Thumb规则在您的模块中,如果您给出一个范围并仅创建该组件一次那么它将存在于整个生命周期中.通常,在APP的Application类中创建一个具有应用程序范围组件的组件.

6 - >*让我们假设有一个DataManager我想用dagger构建的实例.它只有一个依赖.我为此编写了一个模块类和一个组件interface.如果我想MainActivity使用它,我会用它作为

@Inject DataManager dataManager;

...

@Override

protected void onCreate(Bundle savedInstanceState) {

DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();

}

我想datamanager在许多其他活动中使用它,我不希望它是单身.我想将它保持在我使用它的当前活动范围.所以我会用

@Inject DataManager dataManager;

得到那个实例.我应该写

DataManagerComponent.Builder...........

oncreate()我使用的每一项活动中@Inject DataManager dataManager?如果我必须写它,它不会创建更多的样板代码而不是简单地使用

DataManager dataManager = new DataManager();* 

这里你不应该向datamanager提供者提供任何范围,然后每当你说@inject datamanager它将作为不同的对象实例时,即使你的组件是singleton范围.

7 - >*让我们假设有4个对象,它们相互依赖,如D依赖于C,C依赖于B等.

D -> C -> B -> A

让我们假设我已经编写了模块类并为所有4提供了方法.如果我尝试在任何ActivityA类似的情况下注入D

@Inject D d;

C,B,A会自动实例化吗?

让我们假设ActivityB我只需要注入B.如果我注入B就好了

@Inject B b;

会再dagger创造B和A吗?或者它将使用已经创建的那些?*如果注入是通过构造函数创建的,或者你将使用成员注入器,它将被创建.

请仔细阅读YouTube tutorials扭曲的方程式dagger2.这有助于我理解Dagger2.

如果这对你有所帮助,请投票.


推荐阅读
  • 开发笔记:Dagger2 探索记3——两大进阶组件
        今天要讲的时@Scope这个组件。为什么说它是进阶组件,就是因为它基本上没作用,但在理解了基本组件之后又必须用到。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 1.在gradle中添加依赖在主项目的build.gradle中添加Dagger2库的依赖dependencies{compilecom.google.dagger:dagger: ... [详细]
  • Android Studio中使用apt
    AndroidStudio中使用apt一、前言你还在对着枯燥的重复代码一味复制粘贴吗?这样跟搬砖有何区别?你是否曾想过:你用代码编写出一个自动化的APP,但为何代码本身却缺少了活力 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • android 自定义模板下载,android studio 自定义模板
    由于项目用上了mvp架构,基本上一个页面就至少需要新创建6个类,分别是modelviewpresenter的接口以及其对应的实现类,再加上使用dagger的话就要更多了,所以这时候 ... [详细]
  • dagger2简单使用与理解笔记
    文章目录使用dagger2好处具体案例查看github1.使用dagger2注入基本使用流程概念2.dagger2中各种注解基本使用引入dagger20.写两个对象用来实际操作的1 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
author-avatar
惠君宛峰6
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有