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

【大家的项目】Rudi 0.2.0 - 一个开箱即用的依赖注入框架

由于 Rudi 最开始是以 Koin 为参考,写的基于函数 API 的依赖注入框架,后来发现 inventory 这个库,就又添加了一套属性宏 API。...相比起来,函数 API 的功能更全面,遇到属性宏不支持的场景,还得用函数 API (又不是不能用) 。...但是为了使用属性宏更方便,在 0.2.0 版本中,我把函数 API 的中所有从容器中获取实例的功能,都移植到了属性宏中,所以现在只需要使用属性宏就可以用各种方式从容器中获取实例了。...迁移的过程还是很简单的,将原来使用在 struct 的 field 和 fn 的 argument 上的 #[di(...)] 改成 #[di(name = ...)],就可以了。...关于新增的属性宏 API,可以参考 Singleton / Transient。

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

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

Dagger 如果我们希望 Dagger 提供某个类的实例,我们要做的就是在构造函数中添加 @Inject 注解。...image.png 如你所看到该工厂类实现了 get() 并返回了一个新的 CompositeAdapter 实例。这实际上是此类实现的 Provider  接口中指定的方法。...image.png Koin Koin 与 Dagger 以及 Hilt 相比,管理依赖项的方法完全不同。要在 Koin 中注册依赖项,我们不会使用任何注解,因为Koin不会生成任何代码。...对运行时性能的影响 另一方面来说,因为 Koin 在运行时解析依赖项,所以它的运行时性能稍差一些。 image.png 到底相差多少呢?...我认为所有的库:Koin,Dagger 和 Hilt 都达到了这个目的。 所有这些库都有自己的优势,我希望了解它们在底层是如何工作的,能够帮助您自己决定哪种库最适合您的应用。

1.9K40

Android MVVM 架构应用实现

使用ViewModel之前要先建立四个类别的概念: ViewModelProcider.Factory:Factory用来生成ViewModel ViewModel:持有LiveData,Repository...同时本项目使用Koin作为依赖注入的框架,省去初始化ViewModel、Repository、ViewModelProcider.Factory的过程。...初始化: Koin的初始化分为两步: 定义ViewModel,告诉Kioin哪里找到ViewModel和Repository并自动生成,这里我选择直接写在BaseApplication中,需要注意的是需要定义在最外层...,即和Classt同级: 在Application的onCreate()函数中初始化Koin: class BaseApplication : Application() {...本项目使用开源组件库:koin、timber、permissionx、BaseRecyclerViewAdapterHelper 视频:Android中高级进阶之MVVM与JetPack

1.2K20

Android基于DataBinding+Koin实现MVVM模式页面快速开发框架

本篇是 ardf的第二篇,将介绍基于 DataBinding + Koin 实现的 MVVM 模式页面快速开发框架的使用和详细实现。...Koin 无反射、无代码生成且使用更简单;借助该库可轻松在基于 kotlin 的 Android 应用开发中实现依赖注入,降低代码的耦合性。...更多关于 Koin 的介绍及使用请查阅官方文档:Koin[2] 2....源码解析 前面介绍了 ardf实现自动装载布局、自动注入 ViewModel 和事件的处理的使用,那么 ardf是如何实现这些功能的呢?...总结 本文主要介绍了 ardf(Android 快速开发框架)中基于 DataBinding + Koin 的 MVVM 模式的页面快速开发及事件处理的使用方法,并通过源码解析详细介绍了其实现原理,从而进一步提高

1.4K20

Android |《看完不忘系列》之dagger

于是就有了一些库来实现自动依赖注入,有两个实现思路(koin的实现以后再聊~), 一是运行期反射连接依赖项,编译影响小,但运行慢 二是编译期就连接依赖项,创建辅助类需要额外的io和编译耗时,会拖慢编译速度...@Singleton 如果想要给双混动NewCar限量全球一款,可以用@Singleton指定为单例, @Singleton //单例,我现在是限量款混动车 public class NewCar {...获取 在造新车NewCar时,是Provider获取的,跟进newCarProvider.get(),如果使用了单例@Singleton,NewCar_Factory会被DoubleCheck包一层,...contributingMap().entrySet()) { result.put(entry.getKey(), entry.getValue().get()); } //返回不可修改的...首先是架构角度,在谷歌示例中,结合了Activity、伪ViewModel、Repository、DataSource和Retrofit来使用dagger,(还没用过,不知道香不香、坑多不多,靠屏幕前的大佬们反馈了

89310

Java并发编程(3)- 如何安全发布对象

发布对象与逸出 发布对象: 使一个对象能够被当前范围之外的代码所使用,例如通过方法返回对象的引用,或者通过公有的静态变量发布对象 对象逸出: 一种错误的发布,当一个对象还没有构造完成时,就使它被其他线程所见...这里其实我们可以使用工厂方法和私有构造函数来完成对象创建和监听器的注册等等来避免不正确的发布。...此时如果线程B抢占到CPU资源,执行 if (instance == null)的结果会是false,从而返回一个没有初始化完成的instance对象。如下图所示: ? 那么要如何避免这一情况呢?...那么如何防止利用反射构建对象呢?这时我们就需要使用到内部枚举类了,因为JVM可以阻止反射获取枚举类的私有构造方法。...(); } /** * 由枚举类创建单例对象 */ @Getter private enum Singleton { INSTANCE

55420

单例模式

} } return instance; } } volatile 关键词确保了 instance 变量被初始化时,多个线程操作的实例对象是主存中加载的...该方式是对 DoubleLockSingleton.class 类直接加锁,针对于初始化场景下多线程同时触发的,单例实例化仍然会有获取锁的性能消耗,但是区别在于后续判断非 null 的话直接返回了,而不是让所有调用该方法的线程都处于阻塞状态...想象一下,如果实例化 instance 很消耗资源,所以想让它延迟加载,另外一方面,又不希望在 Singleton 类加载时就实例化,因为不能确保 Singleton 类还可能在其他的地方被主动使用从而被加载...@Getter public enum SingletonEnum { /** * 单例 */ INSTANCE(Singleton.getInstance());...singleton; } } 或是这样 @Getter public enum SingletonEnum { /** * 单例 */ INSTANCE;

41940

Java 构造结构私有化

; } } 现在的instance在Singleton里面只是一个普通的类属性,而所有的普通类属性必须在类产生实例化对象之后才可以使用,但是否可以存在一种属性,可以让类属性不受Singleton...类的实例化对象的控制;如果使用 static 声明 instance 属性,那么就表示可以在一个类没有产生实例化对象的时候,直接使用该属性 public class TestDemo {...;而一旦封装属性之后,只可以通过getter方法来实现访问属性,由此需要提供一个geter方法不受到类的new实例化控制;可以使用static属性继续声明该方法。...如果在static声明的方法中,返回的不是唯一的实例化对象的类属性,而是在方法中直接返回实例化对象,结果就是,每一个返回的对象都不是唯一的;为了防止这种情况发生,可以在instance类属性定义的时候,...不管设计模式如何,核心就是构造方法私有化!

56510

【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

singleton) { singleton = [[OCPerson alloc] init]; } return singleton; } @end int main(int argc...使用 :  -- 使用前提 : 使用 @property @synthesize 合成 setter 和 getter 方法; 实际上 也允许使用 ....语法访问属性 和 对属性赋值; -- 本质 : 点语法是一种简单写法, 其本质仍然是 getter 和 setter 方法; -- 获取属性值 : 只要对象有 getter 方法, 程序可以使用 点 语法获取属性值...方法 : 优先考虑调用 getter 方法, 即 属性名() 方法获取返回值; -- 寻找 "_属性名" 成员变量 : 如果没有 getter 方法, 系统会搜索 "_属性名" 成员变量, 不管该成员变量的定义位置...和 用什么访问控制符修饰, 都返回该 "_属性名" 成员变量值; -- 寻找 "属性名" 成员变量 : 如果既没有找到 getter 方法, 也没有找到 "_属性名" 成员变量, 系统会搜索 "属性名

77510

Kotlin 之美

可以返回原类型的任何子类型。...,代码如下,大家可以感受下如何在声明一个单例类的同时创建一个实例: public final class singleton { //在Java中使用singleton.INSTANCE来访问单例...EJ 第21条:用函数对象表示策略 关于这条准则,我们策略模式讲起: ?...高阶函数 关于高阶函数的定义,参考《Kotlin 实战》: 高阶函数就是以另一个函数作为参数或返回值的函数 如果用 lamba 来作为高价函数的参数(此时为形参),就必须先了解如何声明一个函数的形参类型...fun Any.to(that:Any) = Pair(this,that) 这段源码理解起来不难,infix 修饰符代表该函数支持中缀调用,然后为任意对象提供扩展函数 to,接受任意对象作为参数,最终返回键值对

2.9K20

Java设计模式详解

只和直接朋友类发生依赖 不要依赖其他陌生的类 直接朋友,当一个类中的使用到其他类,出现的位置在类成员变量,方法参数,方法返回值时。这就说明两个类是直接朋友。...现有一家面馆,里面售卖牛肉面,鸡蛋面,杂酱面等,那我们将如何使用简单工厂模式获取这些实例呢。 首先我们先写出这三个类,我们用一个抽象类来表示面食,让这三个类去继承它。....buildWall() .buildRoof() .build(); } } 这样,就准备完了,如何使用呢...所以这点原因,此适配器不推荐使用 6.2)对象适配器模式 在里氏替换原则中,能不用继承就不用继承,改用组合,聚合的方法来代替继承。 这点很好理解,在外部将返回的电压转换就可以了。...如何选择代理模式 目标对象实现了接口,可以使用jdk代理 目标对象没有实现接口,用Cglib代理,更推荐 Cglib时一个强大的高性能的代码生成包,它的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类

57220
领券