这部分会介绍Dagger2中比较莫名的概念,同样也不涉及Android的具体代码。...Heater的构造方法此时就需要加入Maker对象,且必须以入参方式存在,而不能在构造方法里直接new一个,原因相信思考一下就明白。...我们需要修改两处地方,一个是Heater的构造方法,一个是HeaterModule的provide方法。...方法也可以像注释掉的代码那部分这么写,一样也可以做到给ElectricHeater注入Cooker的目的,然而这样很明显是错误的,因为这样一来Machine就不能管理Cooker,还记得Cooker是属于...Dagger2会在运行期判断这种情况,如果是一个不需要参数的Module,那么它在没有传入module实例的时候没有任何问题,Dagger2帮你实例化一个module对象;对于需要参数的module而我们又忘了设
Dagger2具有以下好处: 1) 依赖的注入和配置独立于组件之外,注入的对象在一个独立、不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用大改代码库。...@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...:在类的构造方法前面注释@Inject 成员变量注入:在类的成员变量(非私有)前面注释@Inject 函数方法注入:在函数前面注释@Inject 这个顺序是Dagger建议使用的,因为在运行的过程中...这在Android的activity或者fragment中使用成员变量注入会经常遇到,因为我们没有在它们的构造方法中使用。 看一下我们是如何在BaseActivity中注入一个成员变量。
,它并没有用 @Inject 注解构造方法。...Kangshifu 这个类代码中没有被 @Inject 注解过的构造方法,也没有办法从一个被 @Provides 注解过的方法中获取。...方法的返回值可以提供一种类型的对象,前提是这个类的对象被 @Inject 注解过构造方法或者在 Module 中被 @Provides 注解过的方法提供。...@Inject 和 @Provides 的优先级 可能有心思细腻的同学会问,同样是提供依赖,如果一个类被 @Inject 注解了构造方法,又在某个 Module 中的 @Provides 注解的方法中提供了依赖...@Inject 注解过的构造方法,另一方面在 Module 中它又通过 @Provides 提供了依赖。
我们可以用注解(Annotation)来标注目标类中所依赖的其他类,同样用注解来标注所依赖的其他类的构造函数,那注解的名字就叫Inject class A{ @Inject B b; } class...B{ @Inject B(){ } } 这样我们就可以让目标类中所依赖的其他类与其他类的构造函数之间有了一种无形的联系。...我们不讨论具体类的代码,我想从抽象概念的角度来讨论Component。上文中提到Component在目标类中所依赖的其他类与其他类的构造函数之间可以起到一个桥梁的作用。...那我们看看这桥梁是怎么工作的: Component需要引用到目标类的实例,Component会查找目标类中用Inject注解标注的属性,查找到相应的属性后会接着查找该属性对应的用Inject标注的构造函数...因此我们也可以给Component叫另外一个名字注入器(Injector) component.png 小结下 目标类想要初始化自己依赖的其他类:用Inject注解标注目标类中其他类 用Inject注解标注其他类的构造函数
一旦我们的UserModel的创建方式发生了改变(比如需要传入Context对象到构造函数),我们就需要修改所有创建UserModel的代码。...UserModel(); } } 可以看到,我们使用@Module标识类型为module,并用@Provides标识提供依赖的方法。...如果函数声明参数为Activity,dagger2会认为没有需要注入的对象。...2.3 低级Component提供依赖 目前的ActivityComponent代码如下所示。可以看到其只提供了inject方法,而没有提供需要的UserModel依赖。...最后 本文试图用最简单的例子介绍Android中如何使用dagger2进行依赖注入,因此有很多dagger2的特性并未涉及,比如@Scope注释,以及dagger2自动生成代码的分析调试。
类中要提供依赖的注解方法用@Provides注解声明,以此来告诉Dagger要构造对象并提供这些依赖 @Provides public PhotoUtil photoInstance...,我们直接在构造函数上声明了@Inject注解,这个注解有什么用呢?...当Component在所拥有的Module类中找不到依赖需求方需要类型的提供方法时,Dagger2就会检查该需要类型的有没有用@Inject声明的构造方法,有则用该构造方法创建一个,注意:这次我没是没有在...答: 项目中我们会用到别人的jar包,我们无法修改别人的源码,就更别说在人家的类上添加注解了,所以我们只能通过Module类来提供 总结: 我们有两种方式可以提供依赖,一个是注解了@Inject的构造方法...,一个是在Module里提供的依赖,规则是这样的:查找Module中是否存在创建该类的方法,如果没有则查找Inject注解的构造函数 4.高级使用 说完了基本使用,我们来看看Dagger2高级使用的注解
这种联系我们可以这样理解,当看到某个类被@Inject标记时,就会到他的构造方法中,如果这个构造方法也被@Inject标记的话,就会自动初始化这个类,从而完成依赖注入。...之所以有Module类主要是为了提供那些没有构造函数的类的依赖,这些类无法用@Inject标注,比如第三方类库,系统类,以及上面示例的View接口。...时,发现构造函数有个参数,此时会在Module里查找提供这个依赖的方法,将该View传递进去,这样就完成了presenter里View的注入。...里面定义一些用@Provides注解的以provide开头的方法,这些方法就是所提供的依赖,Dagger2会在该类中寻找实例化某个类所需要的依赖。...然后,我们对MainPresenter的构造函数也添加注解@Inject,此时构造函数里有一个参数MainContract.View,因为MainPresenter需要依赖MainContract.View
接口,提供了两个方法,一个返回的是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会自动生成很多类文件
常用注解 @Inject 这个注解有两个作用: 修饰需要注入的属性,Dagger2 会自动注入 修饰被注入的类的构造方法上;Dagger2 会在需要的时候通过这个注解找到构造函数自动构造对象注入 public...相当与一个注射器的角色,将依赖注入到需要的地方。 刚刚通过上面的 @Inject 注解 了 提供依赖的构造方法 和 需要注入的属性,而这样还是不够的,需要使用 @Comnponent 连接起来。...还可以定义 向外提供实例的方法;Dagger2 都会在编译时期生成相应的代码。...@Module && @Provides @Module 这个注解用来标注提供依赖的工厂。对的,工厂,我是这么理解的。 @Provides 这个注解用在提供定义提供依赖的方法上,表示向外提供依赖。...方法的返回类型就是提供的依赖类型。 前面提到的 @Inject 可以在注解在构造函数以用来提供依赖;而在 @Inject 不能满足需要的时候这个就派上用场了。
1、依赖的注入和配置独立于组件之外,注入的对象在一个独立、不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用大改代码库。...} AppModule: 这里提供了AppComponent里的需要注入的对象。...,会报一个循环依赖的错误,这种写法需要在返回参数和入参不是同一个类的情况下才可以。...对于直接返回的类JobExecutor、RetrofitManager,它们类的构造函数一定要加上@Inject的注解: @Inject public JobExecutor() { // 初始化...inject方法将Activity注入到ActivityComponent中,通过该方法,将Activity中需要注入的对象注入到该Activity中。
@Inject提供依赖虽然很简单,但是它也有缺陷: 只能标记一个构造方法,如果我们标记两个构造方法,编译的时候就会报错。因为不知道到底要用哪一个构造提供实例。...不能标记其它我们自己不能修改的类,如第三方库,因为我们没办法用@Inject标记它们的构造函数。...这次以一个Person类为例,代码跟User类似,构造方法没有用@Inject标记。目标类中需要给一个Person类型的成员变量mPserson赋值。...步骤如下: 查找Module中是否存在创建该类型的方法(前提是@Conponent标记的接口中包含了@Module标记的Module类,如果没有则直接找@Inject对应的构造方法) 若存在方法,查看该方法是否有参数...若构造方法中有参数,从步骤1依次开始初始化每个参数。 如果你要问:我既没有@Module提供的实例,也没有@Inject标记的构造方法会怎样?很简单,编译期就会报错。
Dagger2库 关键概念 Inject--你用它告诉Dagger这个类或者字段需要依赖注入 Module-- Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger...在构造类的实例的时候,就知道从哪里去找到需要的依赖 Provide--在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...mvp架构基本搭建,下面是如何运用dagger2; 创建提供应用实例的AppComponent 一个应用在创建时会产生唯一的Application对象,可以在应用的onCreate函数创建,下面有几个步骤...总结 创建module,一般应用于第三方包对象或者应用对象 创建Component,依赖注入器,复杂把注入对象注入到注解成员变量 构造方法注入:在类的构造方法前面注释@Inject 成员变量注入:...在类的成员变量(非私有)前面注释@Inject 开始注入调用注射器的Inject方法 详解Dagger2 Android官方MVP架构示例项目解析 dagger2 让你爱不释手
2.需要依赖的成员和提供依赖的成员构造函数用@Inject标注 City.java ? Province.java ?...小结 回顾下使用注解的步骤: 1.build.gradle中添加dagger2依赖 2.使用@Inject标注在构造函数和被引用的成员变量上 3.新建MainActivityComponent接口,并用...最后在回过头来看下@inject和@component这两个标注,可以得出一些结论: 1.若一个类(Xx)的构造函数被@inject标注,则该类编译时会产生Xx_Factory; 2.若一个类中的成员变量被...如果我们要注入的对象是个接口,接口不能被实例化;或者是我们要注入的对象是第三方库,我们没法把@Inject标注在三方库的构造函数上,真是这样的么?...而配合使用@Module和@Provides则不会出现这种情况。问题又来了,如果依赖的提供方同时存在以@Inject标注和以@Module、@Providers标注,会找哪个?
由 @Inject 指向需要构成注入的类和环境。 由 @Module 提供生成对象所需的参数。(一般是在 @Inject 注解的对象,其构造函数无法添加 @Inject时使用。)...@Inject指定需要注入的类和环境,如下方图2,TasksActivity 中 mTasksPresenter 是被Inject注解的对象,同时TasksPresenter 的构造函数也被Inject...内部成员被 @Inject 注解时,如 mTasksPresenter,Dagger2 就会找 TasksPresenter 中被 @Inject 注解的构造函数,如果找到了,便对其构建注入。 ...这时候通过 @Module ,在内部使用 @Provides注解的以provide开头的方法,这些方法就是所提供注入所需的依赖,如图5。 ?...返回类必须有 @Inject 提供构造方法类,或者引用的 @Module 有 @Provide提供的。
@Inject:@Inject有两个作用,一是用来标记需要依赖的变量,以此告诉Dagger2为它提供依赖;二是用来标记构造函数,Dagger2通过@Inject注解可以在需要这个类实例的时候来找到这个构造函数并把相关实例构造出来...你可能会有点困惑,上面不是提到用@Inject标记构造函数就可以提供依赖了么,为什么还需要@Module?...很多时候我们需要提供依赖的构造函数是第三方库的,我们没法给它加上@Inject注解,又比如说提供以来的构造函数是带参数的,如果我们之所简单的使用@Inject标记它,那么他的参数又怎么来呢?...@Provides:@Provides用于标注Module所标注的类中的方法,该方法在需要提供依赖时被调用,从而把预先提供好的对象当做依赖给标注了@Inject的变量赋值; @Component:@Component...那么Dagger2怎么知道这个方法是为谁提供依赖呢?答案就是返回值的类型,Dagger2根据返回值的类型来决定为哪个被@Inject标记了的变量赋值。
小结 以上是Dagger2最简单的使用方法,注入依赖后,会用在Apple类中标注@Inject注解的构造器自动创建apple对象。...拓展 如果现在需要修改Apple类的构造器,需要加一个Color参数,如下: ? 这时候构造器中的color也需要注入依赖,创建一个简单的Color类并在构造器上标注注解@Inject即可 ?...这样在构建apple对象时会寻找标注了@Inject注解的Color的构造器新建color对象用于apple对象的构造。...小结 使用@Inject和@Component注解注入对象时, 我们需要在声明的注入类的构造器上加上@Inject注解来使对象被创建。...如果遇到注入类构造器不方便编辑时(比如来自三方库,抽象类,接口), 则可以使用@Module和@Provides注解,将对像获得由构造器获得转变为由方法返回,使对象的创建形式更加可控。
IRetrofitRequest 实例对象必须要用@Provides标注,该对象是单例的所以用@Singleton标注,这里为什么用这两个注解标注之后就能实现为AppComponent提供单例的实例,稍后会进行...(this); 原因: 1.因为在App中我并没有哪个对象的声明用了@Inject注解进行标注,而且App中的AppComponent实例对象需要给其他Activity或者类使用。...(这里是MainActivity)注入到MainComponent中,就是上面(代码块5)说过的没有提供返回MainPresenter的方法却多了一个void inject(MainActivity mainactivity...);这里的返回值是void的inject方法名可以是任意的,但是最好写成inject(官方写法)。...如果一个类的构造函数用了@Inject注解标注:例如: public class CC{ @Inject public CC() { } } 就会生成CC_Factory类。
注意,控制反转不等同于依赖注入,控制反转还有一种实现方式叫“依赖查找” Dagger2 Dagger2的作用目的:提供对象实例 1、使用@Inject标注构造函数来提供依赖的对象实例的方法 @Inject...有三种情况不能使用 A、接口没有构造函数 B、第三方库的类不能被标注 C、构造函数中的参数必须配置 ?...dagger2.png 2、用@Provides标注的方法来提供依赖实例,方法的返回值就是依赖的对象实例,@Provides方法必须在Module中,Module 即用@Module标注的类 Module...Provider,每次调用它的 get() 方法都会调用到 @Inject 构造函数创建新实例或者 Module 的 provide 方法返回实例 5、Qualifier(限定符):用于module...每次调用 Module 中的 provide 方法或 Inject 构造函数生成的工厂时都会创建一个新的实例,而使用 Scope 后可以复用之前的依赖实例,简而言之,就是复用实例 @Scope是元注解
@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。...我们想要构造对象并提供这些依赖。...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。 现在我们回头在看看概念是不就明白其中的含义了。...,因为我们UserModule需要context参数,所以我们选择这种构建方法 可以看到在创建对象时我们可以在module中像之前一样提供一个创建的方法,第二种我们也可以通过在对象的构造函数上加上@Inject...注解,这里我们需要一个url和context,我们只需要提供一个创建String的url方法即可,并通过UserModule的构造函数将conetxnt传入,最后提供一个创建UserManager的方法将两个参数穿进去
Moudle,并且将这个Moudle中的提供的构造方法暴露出来,可以看到DatabaseHelper、PreferencesHelper等暴露出来的都是全局使用的对象 @Singleton @Component...,则查找Inject注解的构造函数,看构造函数是否存在参数 步骤3.1:若存在参数,则从步骤1开始依次初始化每个参数 步骤3.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束 因为在使用第三方代码时...,我们无法修改源码的构造方法,所以使用 Module 来提供注入构造 所以再回来看DataManager的构造方法 @Inject public DataManager(RibotsService...标注了构造方法,当注入了DataManager时,在module中找不到对应的 provide 方法,变会在构造方法中寻找,在递归的找参数中的注入… 以下用一张图来概括 ?...更为简洁明了 也可以看我的这一篇实践 同样 P V 直接也可以使用 dagger 解耦。
领取专属 10元无门槛券
手把手带您无忧上云