这个注解本身并没有作用,它需要依赖于注入框架才具有意义,可以用来标记构造函数、属性和方法。 标记构造函数 被标记的构造函数可以有0个或多个依赖作为参数。 同一个类中最多只可以标记一个构造函数。...还有一种做法是@Inject标记被注入类的某个方法,该方法会在类的构造方法之后接着被调用: data class People constructor(val name: String) { @Inject...(或被提供)的依赖。...injectable constructor and governs how the injector reuses instances of the type @Scope是用来标记包含可注入构造函数的类或者提供注入依赖对象的类...,简单来说,可以用来标记包含@Inject构造函数的类或者@Module类。
,需要将 @Inject 添加到要注入的类的构造函数中。...注意:在Kotlin中,仅包含@Provides函数的模块可以是object类。这样,提供程序就可以得到优化,并且几乎可以内联在生成的代码中。...使用@Provides告诉Hilt如何获得具体实例 用来告诉Hilt 如何提供不能被构造函数注入的类型 每当 Hilt 需要提供该类型的实例时,将执行带注释的函数的函数主体。...由于AppDatabase是由Room生成的,因此是项目不拥有的另一个类,因此我们直接复制原方法即可,这里的 @Singleton 标志这个其方法只会被调用一次,类似于一个单例。...Binds的作用就在于此。 需要注意以下使用条件: Binds 必须注释一个抽象函数,抽象函数的返回值是我们为其提供实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。
Dagger2具有以下好处: 1) 依赖的注入和配置独立于组件之外,注入的对象在一个独立、不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用大改代码库。...这样,Dagger就会构造一个这个类的实例并满足他们的依赖。...@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...给了我们一堆选择用来注入依赖: 构造方法注入:在类的构造方法前面注释@Inject 成员变量注入:在类的成员变量(非私有)前面注释@Inject 函数方法注入:在函数前面注释@Inject 这个顺序是
这部分会介绍Dagger2中比较莫名的概念,同样也不涉及Android的具体代码。...Heater的构造方法此时就需要加入Maker对象,且必须以入参方式存在,而不能在构造方法里直接new一个,原因相信思考一下就明白。...我们需要修改两处地方,一个是Heater的构造方法,一个是HeaterModule的provide方法。...() {// return new ElectricHeater(new Cooker());// }} 实际上Module类的provide方法也可以像注释掉的代码那部分这么写,一样也可以做到给...Dagger2会在运行期判断这种情况,如果是一个不需要参数的Module,那么它在没有传入module实例的时候没有任何问题,Dagger2帮你实例化一个module对象;对于需要参数的module而我们又忘了设
我们可以用注解(Annotation)来标注目标类中所依赖的其他类,同样用注解来标注所依赖的其他类的构造函数,那注解的名字就叫Inject class A{ @Inject B b; } class...B{ @Inject B(){ } } 这样我们就可以让目标类中所依赖的其他类与其他类的构造函数之间有了一种无形的联系。...我们不讨论具体类的代码,我想从抽象概念的角度来讨论Component。上文中提到Component在目标类中所依赖的其他类与其他类的构造函数之间可以起到一个桥梁的作用。...那我们看看这桥梁是怎么工作的: Component需要引用到目标类的实例,Component会查找目标类中用Inject注解标注的属性,查找到相应的属性后会接着查找该属性对应的用Inject标注的构造函数...因此我们也可以给Component叫另外一个名字注入器(Injector) component.png 小结下 目标类想要初始化自己依赖的其他类:用Inject注解标注目标类中其他类 用Inject注解标注其他类的构造函数
@Inject 使用 @Inject 来告诉 Hilt 如何提供该类的实例,常用于构造方法,非私有字段,方法中。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...@Provides 常用于被 @Module 注解标记类的内部方法上。并提供依赖项对象。...Hilt 不支持的类中执行依赖注入,在这种情况下可以使用 @EntryPoint 注解进行创建,Hilt 会提供相应的依赖。...使用 @Binds 进行接口注入 Binds:必须注释一个抽象函数,抽象函数的返回值是实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。
@Inject 使用 @Inject 来告诉 Hilt 如何提供该类的实例,常用于构造方法,非私有字段,方法中。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...@Provides 常用于被 @Module 注解标记类的内部方法上。并提供依赖项对象。...Hilt 不支持的类中执行依赖注入,在这种情况下可以使用 @EntryPoint 注解进行创建,Hilt 会提供相应的依赖。...---- 使用 @Binds 进行接口注入 Binds:必须注释一个抽象函数,抽象函数的返回值是实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。
@Inject Inject 主要用来标记需要依赖的变量,告诉Dagger需要为它提供依赖;inject 还被用来标记类的构造函数。...当Dagger2碰到使用@Inject注解的变量时,会去寻找这个变量对应的被@Inject注解的构造函数,把实例构造出来,为变量提供依赖。...@Module Module用于标注提供依赖的类。虽然我们有@Inject注解实现注入,但是@Inject只能注入构造函数为无参的类,要是构造函数是带参数的呢?...那就要使用module注解来解决这个问题,又比如说,有很多的第三方库,我们对它的代码无法进行修改,也就不能对其构造函数加上@Inject注解,那么可咋办啊,@module注释可以很好的解决我们的问题。...@Provides Provides是与Module一起使用的,@Provides用于标注Module所标注的类中的方法,该方法会在需要提供依赖时被调用,在方法内进行对象的初始化,返回对象依赖给标注了
@Inject 使用 @Inject 来告诉 Hilt 如何提供该类的实例,常用于构造方法,非私有字段,方法中。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...@Provides 常用于被 @Module 注解标记类的内部方法上。并提供依赖项对象。...标记类的内部方法,并提供依赖对象 * @Singleton:提供单例 */ @Provides @Singleton fun provideAppDataBase...使用 @Binds 进行接口注入 Binds:必须注释一个抽象函数,抽象函数的返回值是实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。
类中要提供依赖的注解方法用@Provides注解声明,以此来告诉Dagger要构造对象并提供这些依赖 @Provides public PhotoUtil photoInstance...,我们直接在构造函数上声明了@Inject注解,这个注解有什么用呢?...当Component在所拥有的Module类中找不到依赖需求方需要类型的提供方法时,Dagger2就会检查该需要类型的有没有用@Inject声明的构造方法,有则用该构造方法创建一个,注意:这次我没是没有在...答: 项目中我们会用到别人的jar包,我们无法修改别人的源码,就更别说在人家的类上添加注解了,所以我们只能通过Module类来提供 总结: 我们有两种方式可以提供依赖,一个是注解了@Inject的构造方法...,一个是在Module里提供的依赖,规则是这样的:查找Module中是否存在创建该类的方法,如果没有则查找Inject注解的构造函数 4.高级使用 说完了基本使用,我们来看看Dagger2高级使用的注解
@Inject 给一个类的相应的属性做标记时,说明了它是一个依赖需求方,需要一些依赖。 @Inject 给一个类的构造方法进行注解时,表明了它能提供依赖的能力。...对于被 @Inject 注解过构造方法或者在一个 Module 中的被 @Provides 注解的方法提供了依赖时,就可以直接返回传入的参数,而第三方的库或者 SDK 自带的类就必须手动创建了。...方法的返回值可以提供一种类型的对象,前提是这个类的对象被 @Inject 注解过构造方法或者在 Module 中被 @Provides 注解过的方法提供。...@Inject 和 @Provides 的优先级 可能有心思细腻的同学会问,同样是提供依赖,如果一个类被 @Inject 注解了构造方法,又在某个 Module 中的 @Provides 注解的方法中提供了依赖...@Inject 注解过的构造方法,另一方面在 Module 中它又通过 @Provides 提供了依赖。
举个例子:Activity中有一个user类,正常情况下要使用这个user肯定是需要实例化它,不然他是个空值,但是用了依赖注入后,就不需要在Activity内部再去实例化,就可以直接使用它了。...用于提供类的依赖,也就是代表这个类会用到注入的实例。 @Inject。这个注解是用来告诉 Hilt 如何提供该类的实例,它常用于构造函数、非私有字段、方法中。 Hilt支持哪些类的依赖注入。...@Provides * @Singleton 提供单例 */ @Provides @Singleton fun provideOkHttpClient():...@Provides。用于被 @Module注解标记类的内部的方法,并提供依赖项对象。 @Singleton。...提供单例 3)为ViewModel提供的专门的注解 @ViewModelInject,在Viewmodel对象的构造函数中使用 @ViewModelInject 注解可以提供一个 ViewModel。
Hilt通过为项目中的每个 Android 类提供容器并自动管理其生命周期,提供了一种在应用中使用 DI(依赖项注入)的标准方法。...提供一种简单的方法来为各种构建类型(如测试、调试或发布)配置不同的绑定。 但是Android中会实例化许多组件类,例如Activity,因此在应用中使用Dagger需要开发者编写大量的样板代码。...@Inject @Inject的使用基本与Dagger一致,可以用来定义构造方法或者字段,声明该构造方法或者字段需要通过依赖获取。...来注入构造实例,但构造方法中需要提供Map类型的creators。...我们需要做的是只需在ViewModel的构造函数上添加@ViewModelInject。
之所以有Module类主要是为了提供那些没有构造函数的类的依赖,这些类无法用@Inject标注,比如第三方类库,系统类,以及上面示例的View接口。...时,发现构造函数有个参数,此时会在Module里查找提供这个依赖的方法,将该View传递进去,这样就完成了presenter里View的注入。...我们来重新理一遍上面的注入过程,首先弄清楚以下几个概念: @Inject 带有此注解的属性或构造方法将参与到依赖注入中,Dagger2会实例化有此注解的类 @Module 带有此注解的类,用来提供依赖,...里面定义一些用@Provides注解的以provide开头的方法,这些方法就是所提供的依赖,Dagger2会在该类中寻找实例化某个类所需要的依赖。...,所以我们定义了一个类,叫做MainModule,提供一个方法provideMainView,用来提供这个依赖,这个MainView是通过MainModule的构造函数注入进来的,接着我们需要定义Component
常用注解 @Inject 这个注解有两个作用: 修饰需要注入的属性,Dagger2 会自动注入 修饰被注入的类的构造方法上;Dagger2 会在需要的时候通过这个注解找到构造函数自动构造对象注入 public...相当与一个注射器的角色,将依赖注入到需要的地方。 刚刚通过上面的 @Inject 注解 了 提供依赖的构造方法 和 需要注入的属性,而这样还是不够的,需要使用 @Comnponent 连接起来。...还可以定义 向外提供实例的方法;Dagger2 都会在编译时期生成相应的代码。...@Module && @Provides @Module 这个注解用来标注提供依赖的工厂。对的,工厂,我是这么理解的。 @Provides 这个注解用在提供定义提供依赖的方法上,表示向外提供依赖。...方法的返回类型就是提供的依赖类型。 前面提到的 @Inject 可以在注解在构造函数以用来提供依赖;而在 @Inject 不能满足需要的时候这个就派上用场了。
一旦我们的UserModel的创建方式发生了改变(比如需要传入Context对象到构造函数),我们就需要修改所有创建UserModel的代码。...UserModel(); } } 可以看到,我们使用@Module标识类型为module,并用@Provides标识提供依赖的方法。...interface的inject方法需要一个消耗依赖的类型对象作为参数。 注意:这里必须是真正消耗依赖的类型MainActivity,而不可以写成其父类,比如Activity。...如果函数声明参数为Activity,dagger2会认为没有需要注入的对象。...2.3 低级Component提供依赖 目前的ActivityComponent代码如下所示。可以看到其只提供了inject方法,而没有提供需要的UserModel依赖。
1、依赖的注入和配置独立于组件之外,注入的对象在一个独立、不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用大改代码库。...} AppModule: 这里提供了AppComponent里的需要注入的对象。...,会报一个循环依赖的错误,这种写法需要在返回参数和入参不是同一个类的情况下才可以。...对于直接返回的类JobExecutor、RetrofitManager,它们类的构造函数一定要加上@Inject的注解: @Inject public JobExecutor() { // 初始化...inject方法将Activity注入到ActivityComponent中,通过该方法,将Activity中需要注入的对象注入到该Activity中。
2是标记类中的构造方法,告诉Dagger我可以提供这种类型的依赖实例。 @Provide: 对方法进行注解,都是有返回类型的。...不能标记其它我们自己不能修改的类,如第三方库,因为我们没办法用@Inject标记它们的构造函数。...这次以一个Person类为例,代码跟User类似,构造方法没有用@Inject标记。目标类中需要给一个Person类型的成员变量mPserson赋值。...完成上面两步之后我们会不会有这样的思考:如果同时有@Module和@Inject构造方法来提供同一类型的实例,Dagger会调用哪个呢?这就牵涉到@Module和@Inject的优先级问题了。...若构造方法中有参数,从步骤1依次开始初始化每个参数。 如果你要问:我既没有@Module提供的实例,也没有@Inject标记的构造方法会怎样?很简单,编译期就会报错。
接口,提供了两个方法,一个返回的是IRetrofitRequest,一个是Context。...@Provides注解 - @Provides:在标有@Module注解类的内部方法上,提供对象实例。...-@Inject:需要用@Inject注解的地方主要有3,如下 用于标注需要被实例化的对象 提供实例化对象的构造函数 当类被实例化对象之后,需要马上执行的方法 public class A {...@Inject B b;//需要被实例化的对象 } public class B { @Inject//提供对象的实例化构造函数 public B() { }...@Inject//当构造函数被执行之后,立马执行改方法 public void setPresenter(){ xxx; } } -最关键的是执行编译之后 Dagger2会自动生成很多类文件
这样,Dagger就会构造一个这个类的实例并满足他们的依赖。...@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。...; } } @Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的依赖。...,因为我们UserModule需要context参数,所以我们选择这种构建方法 可以看到在创建对象时我们可以在module中像之前一样提供一个创建的方法,第二种我们也可以通过在对象的构造函数上加上@Inject...注解,这里我们需要一个url和context,我们只需要提供一个创建String的url方法即可,并通过UserModule的构造函数将conetxnt传入,最后提供一个创建UserManager的方法将两个参数穿进去
领取专属 10元无门槛券
手把手带您无忧上云