@Inject 使用 @Inject 来告诉 Hilt 如何提供该类的实例,常用于构造方法,非私有字段,方法中。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...@Provides 常用于被 @Module 注解标记类的内部方法上。并提供依赖项对象。...使用 @Module 在注解的普通类,在其中创建第三方依赖的对象即可。 @Module 模块用于向 Hilt 添加绑定,告诉 Hilt 如果提供不同类型的实例。...标记类的内部方法,并提供依赖对象 * @Singleton:提供单例 */ @Provides @Singleton fun provideAppDataBase
@Provides注解的方法中选择调用哪个方法。...类中要提供依赖的注解方法用@Provides注解声明,以此来告诉Dagger要构造对象并提供这些依赖 @Provides public PhotoUtil photoInstance...当Component在所拥有的Module类中找不到依赖需求方需要类型的提供方法时,Dagger2就会检查该需要类型的有没有用@Inject声明的构造方法,有则用该构造方法创建一个,注意:这次我没是没有在...答: 项目中我们会用到别人的jar包,我们无法修改别人的源码,就更别说在人家的类上添加注解了,所以我们只能通过Module类来提供 总结: 我们有两种方式可以提供依赖,一个是注解了@Inject的构造方法...,一个是在Module里提供的依赖,规则是这样的:查找Module中是否存在创建该类的方法,如果没有则查找Inject注解的构造函数 4.高级使用 说完了基本使用,我们来看看Dagger2高级使用的注解
@Inject 使用 @Inject 来告诉 Hilt 如何提供该类的实例,常用于构造方法,非私有字段,方法中。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...@Provides 常用于被 @Module 注解标记类的内部方法上。并提供依赖项对象。...使用 @Module 在注解的普通类,在其中创建第三方依赖的对象即可。 @Module 模块用于向 Hilt 添加绑定,告诉 Hilt 如果提供不同类型的实例。...查找了一些资料: 主要问题之一是,通过在 Hilt 中发现模块的方式,无法区分哪些模块属于应用中的组件(如果他们确实使用过 Hilt) 已经库或其他库中的组件 另一个问题是,他将预先构建的组件层次结构变得复杂和混乱
Provides 方法来提高性能 如果使用的是静态的 @Provides 方法,那么 Dagger 生成的代码将具有更好的性能。...要达成这一效果,使用 Kotlin 中的 object 而不是 class,并在方法前添加 @JvmStatic 注解。这是您应该尽可能遵循的 最佳实践 。...使用 @JvmSuppressWildcards 将确保 Dagger 会看到没有通配符的类型。...内联方法体 Dagger 通过检查返回值类型来确定由 @Provides 方法配置的类型。...NetworkPrinter { return NetworkPrinter() } 如果您需要提供接口的实现,则必须显示指定返回类型。
Kangshifu 这个类代码中没有被 @Inject 注解过的构造方法,也没有办法从一个被 @Provides 注解过的方法中获取。...方法的返回值可以提供一种类型的对象,前提是这个类的对象被 @Inject 注解过构造方法或者在 Module 中被 @Provides 注解过的方法提供。...@Inject 和 @Provides 的优先级 可能有心思细腻的同学会问,同样是提供依赖,如果一个类被 @Inject 注解了构造方法,又在某个 Module 中的 @Provides 注解的方法中提供了依赖...@Inject 注解过的构造方法,另一方面在 Module 中它又通过 @Provides 提供了依赖。...另外,如果要以 @Provides 方式提供单例的话,需要用 @Singleton 注解依赖提供的方法。
请参阅 ——* *Hilt 提供的组件列表:* 构造方法注入 对于我们可以访问构造方法的类,构造方法注入是一个简单的方案来让 Hilt 知道如何提供类型的实例,因为我们只需要在构造器上增加 @Inject...return CoroutineScope(SupervisorJob() + Dispatchers.Default) } } @Provides 注解的方法同时被 @Singleton...@Provides 方法来表示特定的绑定。...@DefaultDispatcher 限定符注解的方法返回默认的 Dispatcher,其余限定符不再赘述。...每次需要这些依赖项时,Hilt 调用被 @Provides 注解的方法返回对应的 CoroutineDispatcher。
我们继承AbstractModule类,并重写configure方法即可。在configure方法中,我们可以调用AbstractModule类提供的一些方法来配置依赖关系。...这时候可以使用 @Provides 方法代替 @Provides方法 当一个对象很复杂,无法使用简单的构造器来生成的时候,我们可以使用 @Provides 方法,也就是在配置类中生成一个注解了 @Provides...方法也可以应用 @Named 和自定义注解,还可以注入其他依赖,Guice会在调用方法之前注入需要的对象 @Provides @PayPal CreditCardProcessor providePayPalCreditCardProcessor...我们可以使用Guice提供的 Provider接口 将复杂的代码放到单独的类中。办法很简单,实现 Provider 接口的get方法即可。...如果不想使用注解的作用域,可以在 bind() 方法中将对象绑定为 Scopes.NO_SCOPE Guice和它的扩展提供了很多作用域,有单例Singleton,Session作用域SessionScoped
相当与一个注射器的角色,将依赖注入到需要的地方。 刚刚通过上面的 @Inject 注解 了 提供依赖的构造方法 和 需要注入的属性,而这样还是不够的,需要使用 @Comnponent 连接起来。...@Module && @Provides @Module 这个注解用来标注提供依赖的工厂。对的,工厂,我是这么理解的。 @Provides 这个注解用在提供定义提供依赖的方法上,表示向外提供依赖。...方法的返回类型就是提供的依赖类型。 前面提到的 @Inject 可以在注解在构造函数以用来提供依赖;而在 @Inject 不能满足需要的时候这个就派上用场了。...解释一下 依赖迷失: 依旧是上面那个例子,现在 都是根据返回值类型来注入的,现在都是不同的类型所以还没有出现迷失的情况; 现在我如果要加上 地址 属性;如下 // activity内 @Inject...始终是跟随所在的 Component 的实例的,如果超出它的范围就无法保证单例。
还需要额外的工作!我们还需要告诉 Hilt 如何处理,当然还是使用注解! 在类的构造方法上添加 @Inject 注解,告诉 Hilt 怎样创建该类的实例。...接下来,当提供 MusicPlayer 的实例时,我们需要调用提供或者满足 MusicDatabase 依赖项的方法。...好吧,毫无疑问,使用另一个注解! 在添加了 @Provides 注解的方法上,我们可以通过使用 @Singleton 注解来告诉 Hilt 组件总是共享该类型的相同实例。...这些注解不仅可以在模块中使用,还可以添加到类上,前提是该类的构造方法已经被添加 @Inject 注解。...绑定 有两种类型的绑定: 未限定作用域绑定 : 没有添加作用域注解的绑定,例如 MusicPlayer,如果它们没有被装载到模块中,则所有组件都可以使用这些绑定。
什么是依赖注入 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。...@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...在这个例子中,我把这些元素暴露给子图, 如果你把他们删掉,编译的时候就会报错。 Application Module: 这里提供了Application Component里的需要注入的对象。...由ApplicationModule里面@Provide注解显示提供的。
@Named注解就需要在Moudle中创建对应没有用@Named注解的实例方法 通过字符串标记一个对象,容易导致前后不匹配,所以除了使用这种方法,我们还可以通过自定义注解的方式。...(XXXModule) 方法 这个如果不太理解也没有关系,会使用就行。...} } 注意事项(重要)分析 componet 的 inject 方法接收父类型参数,而调用时传入的是子类型对象则无法注入 component关联的modules中不能有重复的provide module...的 provide 方法使用了 scope ,那么 component 就必须使用同一个注解 module 的 provide 方法没有使用 scope ,那么 component 和 module...如果注意事项中的错误没有犯的话一定会减少很多错误。 ---- 结语 终于写完了。本来不我自己就不喜欢长文章。不知不觉写的有点多。对我这种小白,看源码写博客。
小结 以上是Dagger2最简单的使用方法,注入依赖后,会用在Apple类中标注@Inject注解的构造器自动创建apple对象。...方法注入 如果注入的对象需要设置为private,那我们可以使用方法注入,示例: private Apple apple;@Injectpublic void setApple(Apple apple)...这时候,如果只按照下面的形式声明,是无法注入apple对象的,运行会报错 @Inject public Fruit apple; 这时候就需要用到@Modele和@Provides注解,完整示例如下:...如果遇到注入类构造器不方便编辑时(比如来自三方库,抽象类,接口), 则可以使用@Module和@Provides注解,将对像获得由构造器获得转变为由方法返回,使对象的创建形式更加可控。...@Named注解 上述的@Module和@Provides注解仅能返回一个继承了Fruit的对象, 如果再加入一个Banana类,继承Fruit并在MainActivity中注入, 这时候就需要使用@Named
我们继承AbstractModule类,并重写configure方法即可。在configure方法中,我们可以调用AbstractModule类提供的一些方法来配置依赖关系。...@Provides方法 当一个对象很复杂,无法使用简单的构造器来生成的时候,我们可以使用@Provides方法,也就是在配置类中生成一个注解了@Provides的方法。...方法也可以应用@Named和自定义注解,还可以注入其他依赖,Guice会在调用方法之前注入需要的对象。...我们可以使用Guice提供的Provider接口将复杂的代码放到单独的类中。办法很简单,实现Provider接口的get方法即可。...如果不想使用注解的作用域,可以在bind()方法中将对象绑定为Scopes.NO_SCOPE。
我们可以发现MainActivity里没有任何有关aaa的初始化赋值,但是它还是可以调用其get()方法。这样我们就达到了解耦合的目的。...当Dagger2碰到使用@Inject注解的变量时,会去寻找这个变量对应的被@Inject注解的构造函数,把实例构造出来,为变量提供依赖。...那就要使用module注解来解决这个问题,又比如说,有很多的第三方库,我们对它的代码无法进行修改,也就不能对其构造函数加上@Inject注解,那么可咋办啊,@module注释可以很好的解决我们的问题。...@Provides Provides是与Module一起使用的,@Provides用于标注Module所标注的类中的方法,该方法会在需要提供依赖时被调用,在方法内进行对象的初始化,返回对象依赖给标注了...,它含有一个成员变量 mView 需要在构造函数时赋值,我们之后会将这个变量给 Presenter 进行 Presenter 的构造,我们还需要写一个方法,并在其上添加@Provides注解,方法的名字其实没所谓可以随便取
相比于new,更容易想到的改进是使用工厂方法,但是工厂方法在测试中仍存在问题(因为通常使用全局变量来保存实例,如果在用例中未重置可能会影响其他用例)。...如果toInstance包含复杂的逻辑会导致启动速度,此时应该通过@Provides方法绑定。...方法绑定 模块中定义的、带有@Provides注解的、方法返回值即为绑定映射的类型。...通过@Provides方法可以显式调用构造器,但是这种方式有一个限制:无法给这些实例应用AOP。...范围的注解可以应该在实现类、@Provides方法中,或在绑定的时候指定(优先级最高): @Singleton public class InMemoryTransactionLog implements
@Inject提供依赖虽然很简单,但是它也有缺陷: 只能标记一个构造方法,如果我们标记两个构造方法,编译的时候就会报错。因为不知道到底要用哪一个构造提供实例。...前面已经提到,@Module标记的类主要起到一个管理作用,真正提供依赖实例靠的是@Provides标记的带返回类型的方法。...步骤如下: 查找Module中是否存在创建该类型的方法(前提是@Conponent标记的接口中包含了@Module标记的Module类,如果没有则直接找@Inject对应的构造方法) 若存在方法,查看该方法是否有参数...若存在参数,则从步骤1开始初始化每个参数 若不存在创建类方法,则查找该类型的类中有@Inject标记的构造方法,查看构造方法中是否有参数 若构造方法中无参数,则直接初始化该类实例,一次依赖注入到此结束。...若构造方法中有参数,从步骤1依次开始初始化每个参数。 如果你要问:我既没有@Module提供的实例,也没有@Inject标记的构造方法会怎样?很简单,编译期就会报错。
IoC程式编程,调用者的代码来处理程序的执行顺序,而程序逻辑则被封装在接受调用的子流程中。 ?...如果声明了@Scoped注解接口,注入对象的声明周期由所声明的@Scoped注解实现决定。 如果注入对象在@Scoped实现中要由多个线程使用,则需保证注入对象的线程安全性。...如果某个类上声明了多个@Scoped注解,或声明了不受支持的@Scoped注解,IoC容器应该抛出异常。...Guice提供多种绑定方式: 链接绑定 绑定注解 实例绑定 @Provides方法 Provider绑定 无目标绑定 内置绑定 及时绑定 最常用的包括链接绑定、绑定注解、@Provides方法、Provider...和Provider:提供完全定制的对象 需要注入特别的AgentFinder,使用@Provides注解或在configure()方法中绑定,注入器会查看左右标记了@Provides注解方法的返回类型,
@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...工厂名称生成规则 如果Component是接口, 则生成Dagger+接口名 如果Component是内部接口,比如本例,则生成Dagger+类名+ _+ 接口名 2....一是检查Null,我表示遇到最多的生产事故是由NullPointException造成的,然后检查是否需要代理,如果本来就是代理类则直接返回,这里就实现了方法的幂等性,重复调用的结果一致。...PumpModule 直接调用方法生产数据,因为没有声明为Singleton,则直接new一个就好。...,当无法自动绑定的时候,比如接口和实现类 使用@Inject可以让IoC容器负责生成instance,如果没有这个注解,dagger将不认识,当做普通类,无法代理 在使用@Component的时候必须要提供
领取专属 10元无门槛券
手把手带您无忧上云