对注入类和被注入类的解耦合,给被注入类生成一个对象。
A.首先从简单的入手,被注入类无参:
创建一个activity,有一个类是Fragment1的属性fragment1,对这个属性@Inject
在类Fragment1中,创建一个实例方法,用于构建实例对象,对这个方法@Inject
创建一个组分接口类,里面有一个接口说明对谁的属性进行的@Inject:MainActivity
在MainActivity中启动:DaggerF1Component.create().inject(this);
一共生成了3个类:
首先是DaggerF1Component,就像是一个组装器一样,它是入口。
initialize初始化了fragment1Provider和mainActivityMembersInjector,分别代表着Fragment1和MainActivity
Fragment1_Factory就是用来生成Fragment1对象的
MainActivity_MembersInjector接收了fragment1Provider,并实现了F1Component接口让MainActivity绑上fragment1对象
B.被注入类有参:
会麻烦不少,毕竟无参的时候用和不用Dagger2也看不出什么差别,反而繁琐了。看到的很多Dagger2的作用都是解耦并且让入参变动对依赖类无甚影响,其实我还不明白为什么。大多以MVP举例,我就不用MVP了。
我现在要MainActivity传一个TextView给Fragment1,把这个TextView展示在界面上。
添加了一个传递的参数testView,启动方法也改了,将模块添加了进去
更改了Fragment1的实例方法,接收入参textView,将其展示切片在右下角
添加了一个模块类ModuleForTextView,也是接收了传参,并把这个参数通过providexxx的方法作为返回值返回了
在MainActivity中启动:DaggerF1Component.builder().moduleForTextView(new ModuleForTextView(textView)).build().inject(this);
一共生成了4个类,其中MainActivity_MembersInjector无变动:
主要变动了构造,因为Builder里面接收了Module的实例,把实例给了ModuleForTextView_ProvideTextViewFactory生成了provideTextViewProvider;然后把provideTextViewProvider又给了Fragment1,就是模块入参就等于是Fragment1入参了
ModuleForTextView_ProvideTextViewFactory拿了模块入参创建了对象,get返回了入参的textView
这时候我Fragment1又要加一个入参了,这时候可以加一个模块,加一个Button试一下。
理解:
1.Component负责组装、启动,通过被注入类的MembersInjector injectMembers 注入属性;
2.Module是被组装的一个模块,一个积木,最终形态要符合注入类的形态,通过providexxx将东西给出去;
3.@Inject注释的实例构造方法决定了形态。
4.应该用于某种组装业务或者组装逻辑场景。类似flutter的fish_redux。
注:如果一样的类型区分不了那就得用@Qualifier,See.
Demo
学习参考:
Dagger 2 的基本使用与原理
Dagger2从入门到放弃再到恍然大悟