通过@Inject提供对象来依赖注入有以下两个缺点
- 如果要注入的对象属于某个第三方库中的类,那么我们是无法在在这个类的构造方法上添加@Inject注解的
- 如果要注入的对象是个abstract抽象类或者Interface接口,那么这个类似没有构造方法的,也无法添加@Inject注解
要解决以上问题,这时候就需要@Module和@Provides这对好基友上场了
二话不说,直接上代码
1 | public interface Person { |
1 | public class Student implements Person { |
1 |
|
1 | // 这里记得加载module |
1 | public class MainActivity extends AppCompatActivity { |
运行结果,成功注入了Person对象
生成代码解析
Dagger为我们生成了很多代码,我们看下注入的流程
DaggerMainActivityComponent和MainActivity_MemberInjector在前面的文章中已经有介绍就不黏贴了
我们这次主要看下跟@Module和@Provides有关的MainModule_ProvidePersonFactory的代码,代码很简单,通过module来提供注入的对象
1 | public final class MainModule_ProvidePersonFactory implements Factory<Person> { |
我们再看下整个的注入流程的代码
1 | DaggerMainActivityComponent.create().inject(this); |
DaggerMainActivityComponent中的相关代码
DaggerMainActivityComponent内部的建造器,Module在这里生成
1 | public static final class Builder { |
1 |
|
MainModule_ProvidePersonFactory中的proxyProvidePerson()方法,返回由module提供的Person对象
1 | public static Person proxyProvidePerson(MainModule instance) { |
MainActivity_MembersInjector中的injectPerson()方法,将提供的Person对象赋值给Activity的person成员变量,完成注入
1 | public static void injectPerson(MainActivity instance, Person person) { |