Dagger2和MVParms的学习
Dagger2学习成本有点高:
推荐几篇博客:
https://www.jianshu.com/p/cd2c1c9f68d4这里讲依赖注入
https://www.jianshu.com/p/3a3748260eac这里讲注解
https://blog.csdn.net/u013320868/article/details/54926578这里依赖注入实现一个butterknife
https://blog.csdn.net/mq2553299/article/details/73065745他有4篇需要看完
https://www.jianshu.com/p/22c397354997这篇需要反复看很不错
https://www.jianshu.com/p/c556b415b800这里讲dagger2和MVP模式结合很不错
代码地址:稍后
Dagger2学习笔记一:
/** * dagger2理解: * [email protected]标记的属性,表示这个属性将会被注入到当前类中---提供注入数据 * [email protected]标记的构造方法,表示在注入过程中将会调用这个方法来实例化 * [email protected]标记的是类 * [email protected]也表示---提供注入数据的模块 * [email protected]的一般作用是提供一个 无法直接使用@Inject标记构造方法来实例化的 实例(比如OkHttpClient的构造方法没有标记@Inject, * 就需要HttpActivityModule2来实例化一个OkHttpClient实例,提供出来) * [email protected]标记一个方法,表示这个方法要提供实例,这个实例在某个类中被@Inject标记的 * [email protected]表示注射器,用于连接提供数据的类和使用数据的类 * [email protected]标记的是接口 * [email protected]在只存在@Inject地方不用写(modules = xxxx.class)因为没得! * [email protected]在有module的时候,需要写modules = HttpActivityModule2.class。关联的提供数据的类 * [email protected]重写一个 void inject(A01SimpleActivity activity)方法,关联使用数据的类; * 12.在使用属性的地方,比如这里的MainActivity需要注意的地方: * 12a.对比MainActivity和HttpActivity,不使用Module可以不写httpActivityModule2 * 12b.使用了Module的,且Module有参数的必须写httpActivityModule2 * 小结: * @Inject 注解构造 生成“大众”工厂类 * 或者 * @Module [email protected] 提供注入“私有”工厂类 * 然后通过Component 创建获得Activity,获得工厂类Provider,统一交给Injector * 最后Injector将Provider的get()方法提供的对象,注入到Activity容器对应的成员变量中,我们就可以直接使用Activity容器中对应的成员变量了! * * * Dagger2理解 * 1.通过DaggerXXXComponent.builder().build()出来的,实际是XXXComponent的实例 * 2.在@Component中void inject(XXX xxx)表示注入到哪个类里面 * 2.1如果在@Component中这样使用,比如ApplicationComponent中 这个方法ApplicationBean providerAppBean(); 说明将BeanForApplication开放给其他Component使用 * 2.1https://blog.csdn.net/u010961631/article/details/72626134 * 3.在使用依赖是子的作用范围不能大于父 * [email protected]只是限定范围内为单例 * 5.编译后生成的Component实现类的名称是Dagger+我们所定义的Component接口的名称。 * 6.Component中返回值为void且有参的方法,方法名是无所谓的,参数是最重要的代表的是要注入的目标位置,但是方法名一般为inject; * 7.Component中返回值不为void且无参的方法,方法名是无所谓的,返回值是最重要的代表的是暴露给子Component使用的依赖或者是获取的子Component的类型。 */
Dagger2学习笔记二
/** * 这个例子可以表明 * 0.在MainActivity的注入里面 .appComponent(MyApplication.appComponent)一下,就能使用AppModule提供的属性 * [email protected]确实是有效的 * 2.在MainActivity里面注入了mainPresenter,那么这时MainPresenter已经被实例化了 * 3.实例化了MainPresenter,那么MainPresenter里面需要注入的其他属性都被注入了(MainActivity里可以用的,MainPresenter也可以用) * 3.1这一点通过DaggerMainAcitivityComponent可以看出来 * 3.2: * this.mainPresenterProvider = MainPresenter_Factory.create(mainPresenterMembersInjector, provideLoginViewProvider); * this.mainActivityMembersInjector = MainActivity_MembersInjector.create(sharedPreferencesProvider, myApplicationProvider, mainPresenterProvider); * mainActivityMembersInjector的创建,是传入了myApplicationProvider和sharedPreferencesProvider的 * 所以MainPresenter里面可以用myApplication,mainPresenter,是注入了的。 * 不用再在Presenter里面DaggerXXXComponent.builder().build().inject()了。 * 4.TestClass的实例化表明:要想实例化Presenter,那么presenter里面所有的属性都需要被实例化。不用再Presenter里面做“注入操作” * 4.1这里的“注入操作”是在实例化presenter时,由框架自身实现的。 * */
MVPamrs全家桶的理解