一个Component可以通过dependencies依赖另一个Component,可以获取到另一个Component提供的依赖
具体代码如下:
1 | public interface Person { |
1 |
|
注意这里为Person单独创建了一个Component然后依赖PersonModule,而不是直接把PersonModule设置给MainActivityModule
而且里面的getPerson()方法单纯提供Person对象,不像MainActivityModule中的inject()方法用于注入
1 | (modules = PersonModule.class) |
这里有别于依赖于Module的写法@Component(modules = PersonModule.class),而是直接依赖PersonComponent
1 | (dependencies = PersonComponent.class) |
这里需要注意的是personComponent()方法必须调用且传递一个PersonComponent对象进入,否则在运行时会报如下错误
实现代码
1 | Caused by: java.lang.IllegalStateException: com.him.hisapp.PersonComponent must be set |
1 | public class MainActivity extends AppCompatActivity { |
DaggerMainActivityComponent源码解析
我们主要看下Dagger为我们生成的DaggerMainActivityComponent的源码,里面依赖了PersonComponent
在Builder.build()方法调用是会判断personComponent是否为空,空的话会抛异常,至于为什么不在为空的时候直接new一个DaggerPersonComponent出来目前我还不知道原因,还请有知道的读者评论说明下
1 | public final class DaggerMainActivityComponent implements MainActivityComponent { |
注入的流程
我们再看下Dagger为我们生成的代码再注入的整个过程中做了哪些工作
首先从MainActivity中调用DaggerMainActivityComponent.inject()开始,记得必须调用personComponent设置依赖的Component
1 | DaggerMainActivityComponent.builder() |
看下DaggerMainActivityComponent中的Builder代码,卡夏是如何设置personComponent的和在build()的时候如果personComponent为空会抛出异常
1 | public static final class Builder { |
DaggerMainActivityComponent的inject()方法内部调用了injectMainActivity()方法
1 |
|
DaggerMainActivityComponent的injectMainActivity()方法内部调用了MainActivity_MembersInjector.injectPerson()方法来完成Person的依赖注入,传入MainActivity对象和一个Person实例,而这个Person实例就是由PersonComponent的gerPerson()方法提供的
1 |
|
我们在看下DaggerPersonComponent的getPerson()方法,里面调用了PersonModule_ProvidePersonFactory.proxyProvidePerson()
1 |
|
看下PersonModule_ProvidePersonFactory.proxyProvidePerson()方法内部就明白了Persong对象最终是由PersonModule提供的
1 | public static Person proxyProvidePerson(PersonModule instance) { |
最终再看下MainActivity_MembersInjector.injectPerson()方法,里面把生成的person对象赋值给MainActivity的person变量,最终完成依赖的注入
1 | public static void injectPerson(MainActivity instance, Person person) { |
总结以上的注入流程就是
MainActivityComponent依赖PersonComponent
PersonComponent依赖PersonModule
所以最终的Person对象是由Module提供的