首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

快刀斩乱码—— Dagger2没有想象的那么难

2是标记类中的构造方法,告诉Dagger我可以提供这种类型的依赖实例。 @Provide: 对方法进行注解,都是有返回类型的。...步骤如下: 查找Module中是否存在创建该类型的方法(前提是@Conponent标记的接口中包含了@Module标记的Module类,如果没有则直接找@Inject对应的构造方法) 若存在方法,查看该方法是否有参数...包含方式——这里就用到了我们@SubComponent注解,用@SubComponent标记接口或者抽象类,表示它可以被包含。...一个Component可以包含一个或多个Component,而且被包含的Component还可以继续包含其他的Component。说起来跟Activity包含Fragment方式很像。...在ActivityComponent中我们可以包含其它的Component。只需有一个返回被包含Component类型的方法就好。

1.1K20

Dagger Android支持库(译文)

使用Dagger编写Android应用程序的一个主要困难是,许多Android框架类都由操作系统本身实例化,如Activity和Fragment,但如果Dagger可以创建所有注入的对象,则效果最佳。...即使这是通过接口而不是具体类型完成的,它也打破了依赖注入的核心原则:类不应该知道它是如何注入的。 dagger.android中的类提供了一种简化此模式的方法。...而不需要第2步和第3步,添加一个返回活动的抽象模块方法,使用@ContributesAndroidInjector对其进行注释,并指定要安装到子组件中的模块。...Dagger 还为同一目的提供了 DaggerApplication - 您需要做的就是扩展它并覆盖applicationInjector()方法以返回应该注入 Application 的组件。...因为Dagger生成的 AndroidInjector.Builder 实现确实保留了正在注入的 Activity / Fragment / etc的实例,所以将范围应用于提供它们的方法是一个编译时错误

97830
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    如何使用MVP+Dagger2+RxJava+Retrofit开发(1)

    .不同的项目有不同的情况,开发项目是找一个最适合的,而不是性能最好,开发时间最短等。...Dagger2库 关键概念 Inject--你用它告诉Dagger这个类或者字段需要依赖注入 Module-- Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger...,我们就可以告诉 Dagger我们想要哪种类型的context。...总结 创建module,一般应用于第三方包对象或者应用对象 创建Component,依赖注入器,复杂把注入对象注入到注解成员变量 构造方法注入:在类的构造方法前面注释@Inject 成员变量注入:...在类的成员变量(非私有)前面注释@Inject 开始注入调用注射器的Inject方法 详解Dagger2 Android官方MVP架构示例项目解析 dagger2 让你爱不释手

    1.6K80

    Jetpack新成员,一篇文章带你玩转Hilt和依赖注入

    但是到了仓库层,一个尴尬的事情出现了,谁应该去负责创建仓库的实例呢?ViewModel吗?...但是Dagger却空有知名度,现在应该没有任何项目还在使用它了,为什么呢? 这就是一个很有意思的故事了。...这就很奇怪了,正常情况下一个库的1版和2版应该都是由同一个公司或者同一批开发者维护的,怎么Dagger1到Dagger2会变化这么大呢?...首先我们要定义一个抽象函数,为什么是抽象函数呢?因为我们并不需实现具体的函数体。 其次,这个抽象函数的函数名叫什么都无所谓,你也不会调用它,不过起个好点的名字可以有助于你的阅读和理解。...第三,抽象函数的返回值必须是Engine,表示用于给Engine类型的接口提供实例。那么提供什么实例给它呢?抽象函数接收了什么参数,就提供什么实例给它。

    2.6K30

    使用这些AI工作流来减少您的技术债务

    我们知道我们应该投资,我们也试图取得进展,但感觉就像逆流而上。尽管我们进行了投资,但技术债务仍在不断累积。 一些人提出将AI作为一种解决方法。...这种新的AI方法具有令人难以置信的潜力,也是我在过去几个月里大力投资的一个领域,因为它可能是我们解决我们所有人积累的大量技术债务的最佳机会。...这种缺乏测试覆盖率会带来风险,因为未经测试的代码部分可能包含错误或不兼容性。 AI可以在哪里提供帮助?...我花在Dagger上的时间越多,就越能看到它改变我们从根本上管理软件管道的潜力。 为什么我喜欢 Dagger?因为它通过提供一个对复杂管道系统的抽象层,简化了工作流的创建和部署。...执行和错误处理: 生成的代码在容器中执行,并在其中检测错误。 反馈循环: 如果发现错误,AI 会接收该反馈并改进其生成的代码,从而创建一个持续改进循环。

    10410

    Dagger2 Android应用:@Scope和@Subcomponent

    这个解释比较抽象,它说明一个概念就是,在不使用@Scope的情况下,可能每次注入的对象都会是一个新的不同的对象,而@Scope能限制被注入的对象,在同一个@Scope的生命周期(lifetime)中都只存在一个且仅有一个对象...是的其实在Dagger2中,单例对象的实现方式就是用@Scope,Dagger2给开发者提供了一个默认的已经定义好的单例注解,@Singleton。...方法也可以像注释掉的代码那部分这么写,一样也可以做到给ElectricHeater注入Cooker的目的,然而这样很明显是错误的,因为这样一来Machine就不能管理Cooker,还记得Cooker是属于...注意,在Dagger2中的单例,应该理解为在它所注解的@Scope的Component中只存在一个,这与通过private constructor + getInstance()来实现的单例有所不同 然后我们回到...为了验证我们通过log来看是否是同一个对象, 聪明的你应该已经明白这是怎么回事了,这也是Dagger2中单例的实现方式。

    87420

    Android注解三大框架Dagger、Hilt 和 Koin 有何不同?

    Hilt 是一个内部使用 Dagger 的库,只是简化了它的用法,因此我在这里所说的有关 Dagger 的内容也适用于 Hilt。在本文中,我不会告诉您应该选择哪个库。...这实际上是此类实现的 Provider  接口中指定的方法。其他类可以使用 Provider 接口来获取一个类的实例。...如果您使用 Hilt,它确实为我们生成了一些额外的类,这些类简化了 Dagger 的使用,并减少了我们需要编写的样板代码的数量。但核心部分保持不变。...get()方法将查找为给定类型的类注册工厂,并将其注入其中。 image.png 有什么影响? Dagger 生成代码来提供依赖,而 Koin 不生成代码,这实际上带来了一些影响。 1....错误处理 因为Dagger 是一个编译时依赖注入框架,如果我们忘记提供某些依赖,我们几乎会立即知道我们的错误,因为我们的项目将构建失败。

    2.5K40

    「android」摆正姿势,dagger2,从精通到上瘾

    在学习使用dagger2的过程中,我遇到了以下的一些困惑: dagger2中的Inject,Component,Module,Provides等等都是什么东东,有什么作用?...在具体学习dagger2的时候,看了好多博客,看的时候感觉挺简单的,但是在真正使用到项目中时候,脑袋就懵了,无从下手,Component应该怎么用,能放些什么方法? Module应该放些啥内容?...Inject.png Component又是什么鬼 Component也是一个注解类,一个类要想是Component,必须用Component注解来标注该类,并且该类是接口或抽象类。...我们不讨论具体类的代码,我想从抽象概念的角度来讨论Component。上文中提到Component在目标类中所依赖的其他类与其他类的构造函数之间可以起到一个桥梁的作用。...Module和Provides是为解决第三方类库而生的,Module是一个简单工厂模式,Module可以包含创建类实例的方法,这些方法用Provides来标注 component_module_inject.png

    99530

    【Android】Android开发架构规范【转】

    java代码中不出现中文,最多注释中可以出现中文 服务端可以实现的,就不要放在客户端 引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大 处理应用全局异常和错误,将错误以邮件的形式发送给服务端...图片的.9处理 使用静态变量方式实现界面间共享要慎重 单元测试(逻辑测试、界面测试) 不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突...- - 服务端响应数据是否有效判断 对于未完成的方法,使用TODO加以标记 若功能已完成,但存在效率等潜在问题时,使用XXX加以标记 若代码存在严重问题或仅用于调试,使用FIXME加以标记 values...引入Dagger2 减少模块之间的耦合性 Dagger2 是一个依赖注入框架,使用代码自动生成创建依赖关系需要的代码。减少很多模板化的代码,更易于测试,降低耦合,创建可复用可互换的模块。...比如DataManager中的退出登录方法可以发送一个事件,订阅这个事件的多个Activity在接收到该事件后就能够更改它们的UI视图,从而显示一个登出状态。

    1.2K90

    Effective-java-读书笔记之类和接口

    这些域要么包含基本类型的值, 要么包含指向不可变对象的引用.长度非零的数组总是可变的, 所以, 类具有公有的静态final数组域, 或者返回这种域的访问方法, 这几乎总是错误的. -> 改进: 让数组域...如果方法调用到了可覆盖的方法, 在它的文档注释末尾应该包含关于这些调用的描述信息: Implementation Requirements, @implSpec(Added in Java 8).这段描述信息要以这样的句子开头...(从Java 8开始接口也可以包含默认方法了.)抽象类需要继承(Java只允许单继承), 但是可以实现多个接口.使用接口的好处:现有的类可以很容易被更新, 以实现新的接口.接口是定义混合类型(mixin...如果在后续的发行版本中, 你希望在抽象类中增加新的具体方法, 始终可以增加, 它包含合理的默认实现....Java库的默认方法是高质量, 通用的实现, 大多数情况都能工作得很好.但并不是永远都能写一个在任何情形下都适用的默认方法实现. -> 比如removeIf, Apache的SynchronizedCollection

    71671

    Dagger2图文完全教程

    而android开发当前非常流行的非MVP模式莫属了,Dagger2的目标便是将MVP中的V P 进一步解耦,达到模块化最大的解耦,使得代码更容易维护。...结构如下: 为了更好的来学习它,我们来依次看看各种使用情况。 1 常规使用方法 直接感受下,如何? 2 带一个参数的效果 我们来看一个代码段,当我们创建两个实例的时候,发现地址是独立的。...这个标记不是使用@Scope注释的哦,是使用@Qualifier 标记的,它的目标是,为了区分如果同时返回类型一样,比如构造男孩,女孩的基本属性,性别和名字时候,获取男孩和女孩都是一个对象,我们该如何区分呢...这里稍安勿躁,先来看相同效果的另一个注释,@Name,这个是Dagger2自带的一个让区分,效果如下: 这里@Name可以简单的一个使用方式,就是它不是区分对象,而是限制使用时候必须加入这个注释,否则报错...那么它就可以定义成子组件,谁需要在谁的组件里面加一下,具体看例子: 7 懒加载方式 8 多个绑定方式 1 第一种方式 2 第二种方式 这里需要注意的就是,在组件里面加入多个绑定的时候,module的里面必须要有一个是

    3.2K90

    Android性能优化(四)之内存优化实战

    如果系统不能回收到足够的RAM数量,系统将会清除所有的LRU缓存中的进程,并且开始杀死那些之前被认为不应该杀死的进程,例如那个包含了一个运行态Service的进程。...传统Java API中提供的HashMap工具类会相对比较低效,因为它需要为每一个键值对都提供一个对象入口,而SparseArray就避免掉了基本数据类型转换成对象数据类型的时间。...然而,抽象会导致一个显著的开销:面向抽象需要额外的代码(不会被执行到),同样会被咨映射到内存中,耗费了更多的时间以及内存空间。因此如果面向抽象对你的代码没有显著的收益,那你应该避免使用。...例如:在For循环中分配了多个临时对象,或在onDraw()方法中创建了Paint、Bitmap对象,应用产生了大量的对象;这会很快耗尽young generation的可用内存,导致GC发生。...内存中出现的不应该被加载的图 通过查阅代码,发现问题出在:此处下载图片作为另一个模块的使用图,但是下载的方法竟然是使用图片加载器加载出来Bitmap然后再保存到本地;而且保存之后也没有将Bitmap对象释放掉

    1.2K30

    Android | dagger细枝篇

    @Binds和@Provides区别 Binds和Provides都是搭配Module(模块,用于支持模块化)使用的,Binds表示抽象和具体的绑定,作用在抽象方法上,如下, @Module abstract...当有多个相同类型的实例要提供时,比如轮胎有最小和最大尺寸都是相同的int类型, public class Wheel { int minSize; int maxSize; @...)简单来说,就是先统一接口,然后按需扩展自己的实现类,到了运行的时候再去查找加载对应的实现类,不过这里的实现类,我们集中放在一个事先约定好的地方。...注意:dagger的SPI还是实验性的,随时可变 我们看到dagger的spi包下的一个接口BindingGraphPlugin, //我是一个插件接口,可以插在dagger图绑定(创建类连接依赖关系)...gRPC RPC(Remote Procedure Call)是远程过程调用,后端进行服务化后,通常会在一个主机上调用另一个主机提供的方法,比如获取一个用户收藏的商品,用户服务器就会调用商品服务器的方法

    77210

    Dagger2 入门解析

    modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。...而父context只能注入自己声明的bean。 而在dagger2的这个module里,module可以看做是一个打包。最外层的包显然包含了所有的bean。...可以学习下这种抽象方法,虽然Factory和Provider几乎一模一样,但分出来是为了标记。或者说归类。比如,区别于DoubleCheck。看名字都能才出来,DoubleCheck是一个代理类。...DoubleCheck实现了Provider和Lazy的接口,而Provider和Lazy除了名字不同以为,一模一样。都是提供一个Get方法。再次体现了接口抽象的命名标记法。...生成的代码不复杂,但抽象度极高,虽然看的容易,但想象出并设计成这样就很难了。百度里一堆自己实现一个DI啥的,说起来简单,DI就是一个工厂模式。但你设计的DI有考虑这么多东西吗。

    1.5K120

    Hilt-依赖注入框架上手指南

    一个常见的误解是,模块中声明的所有绑定都将作用于安装该模块的组件。但是,事实并非如此。仅使用范围注释注释的绑定声明将被限制范围。 那什么时候添加注入范围呢?...使用@Provides告诉Hilt如何获得具体实例 用来告诉Hilt 如何提供不能被构造函数注入的类型 每当 Hilt 需要提供该类型的实例时,将执行带注释的函数的函数主体。...由于AppDatabase是由Room生成的,因此是项目不拥有的另一个类,因此我们直接复制原方法即可,这里的 @Singleton 标志这个其方法只会被调用一次,类似于一个单例。...Binds的作用就在于此。 需要注意以下使用条件: Binds 必须注释一个抽象函数,抽象函数的返回值是我们为其提供实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。...这里我们用到了挂起函数,对于这块不怎么熟系的同学,可以理解为,其相当于一个标记位,提示编译器这块可能会有耗时操作,挂起函数即逻辑上的一个处理。具体理解可参考扔物线等大佬的解释,这里不做过多解释。

    1.8K10

    Android Hilt实战初体验: Dagger替换成Hilt

    在组件化AwesomeGithub项目中使用了Dagger来减少手动依赖注入代码。虽然它能自动化帮我们管理依赖项,但是写过之后的应该都会体会到它还是有点繁琐的。...提供一种简单的方法来为各种构建类型(如测试、调试或发布)配置不同的绑定。 但是Android中会实例化许多组件类,例如Activity,因此在应用中使用Dagger需要开发者编写大量的样板代码。...Hilt要做的很简单,添加几个注释 @HiltAndroidApp class App : Application() { ... } 所有的Hilt应用都必须包含一个带@HiltAndroidApp注释的...这个时候可以使用@IntoMap,为了匹配Map的类型,需要定义一个@MapKey的注释 @Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER...目前唯一一个比较不理想的是对于@Providers的使用,构造方法中不能有参数,如果在用Dagger使用时已经有参数了,再转变成Hilt可能不会那么容易。 庆幸的是,Dagger与Hilt可以共存。

    1.8K20

    Android开发规范(转自掘金,转MD格式)

    高度抽象 解决问题的一般方法是从抽象到具体,PBF 包名是对功能模块的抽象,包内的 class 是实现细节,符合从抽象到具体,而 PBL 弄反了。...当一个方法有很多参数或者参数很长的时候,我们应该在每个 , 后面进行换行。...8.2 方法注释 每一个成员方法(包括自定义成员方法、覆盖方法、属性方法)的方法头都必须做方法头注释,在方法前一行输入 /** + 回车 或者设置 Fix doc comment(Settings ->...有时一个类可能包含大量的方法,同时需要对每个方法进行几次测试。在这种情况下,建议将测试类分成多个类。...方法基本上都按照调用的先后顺序在各自区块中排列; 相关功能作为小区块放在一起(或者封装掉); 当一个类有多个构造函数,或是多个同名函数,这些函数应该按顺序出现在一起,中间不要放进其它函数; 数据提供统一的入口

    9610

    Proguard 常用规则

    例如,为了保留一个程序,你要指定Main方法和类。为了保留一个库,你应该指定所有被公开访问的元素。...-dontnote [class_filter] 指定不打印有关配置中可能的错误或遗漏的注释, 例如类名中的拼写错误或缺少可能有用的选项。...为了理解语法,你应该看看这些例子,但这是对一个完整的正式定义的尝试: [@annotationtype] [[!]public|final|abstract|@ ...] [!]...如果需要,应该在单独的选项中指定。 @ 可用于将类和类成员限制为使用指定的注释类型进行注释的类。annotationtype 就像类名一样被指定。...|匹配类名中的单个字符| |*|匹配类名中的任何部分但不包含包分隔符| |**|匹配类名中的任何部分,可以包含任意包分割符| |***|匹配任何类型(原始类型或者非原始类型,数组或者非数组)| |—|匹配任何类型的任意数量的参数

    1.8K20

    Android开发架构规范前言命名规范编程规范代码提交规范架构规范参考文章

    java代码中不出现中文,最多注释中可以出现中文 服务端可以实现的,就不要放在客户端 引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大 处理应用全局异常和错误,将错误以邮件的形式发送给服务端...图片的.9处理 使用静态变量方式实现界面间共享要慎重 单元测试(逻辑测试、界面测试) 不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突...服务端响应数据是否有效判断 对于未完成的方法,使用TODO加以标记 若功能已完成,但存在效率等潜在问题时,使用XXX加以标记 若代码存在严重问题或仅用于调试,使用FIXME加以标记 values目录下文件名称较固定...引入Dagger2 减少模块之间的耦合性 Dagger2 是一个依赖注入框架,使用代码自动生成创建依赖关系需要的代码。减少很多模板化的代码,更易于测试,降低耦合,创建可复用可互换的模块。...比如DataManager 中的退出登录方法可以发送一个事件,订阅这个事件的多个Activity在接收到该事件后就能够更改它们的UI视图,从而显示一个登出状态。

    1.4K80
    领券