Dagger2生成代码解析
来源:互联网 发布:网络诈骗妇女案例 编辑:程序博客网 时间:2024/06/06 09:22
Dagger2生成代码解析
根据一个简单的Dagger2示例程序,进行进一步的探索,对Dagger2自动生成的代码进行解析。以下解析都基于该Demo生成的类进行。
UML
DaggerActivityComponent.Builder类
作用: 生成该类的父类 (DaggerActivityComponent)
public static final class Builder {private ActivityModule activityModule; private Builder() { } /* * 生成Component实现类 */ public ActivityComponent build() { if (activityModule == null) { this.activityModule = new ActivityModule(); } return new DaggerActivityComponent(this); //Component:被装饰的类 } /* * 设置Module */ public Builder activityModule(ActivityModule activityModule) { if (activityModule == null) { throw new NullPointerException("activityModule"); } this.activityModule = activityModule; return this; } }
DaggerActivityComponent
作用: 初始化Provider,MembersInjector,关联Activity和Module,进行注入
@Generated("dagger.internal.codegen.ComponentProcessor")public final class DaggerActivityComponent implements ActivityComponent { private Provider<Person> provideUserModelProvider; private MembersInjector<MainActivity> mainActivityMembersInjector; private DaggerActivityComponent(Builder builder) { assert builder != null; initialize(builder); } public static Builder builder() { return new Builder(); } public static ActivityComponent create() { return builder().build(); } /* * 进行初始化 */ private void initialize(final Builder builder) { this.provideUserModelProvider = ActivityModule_ProvideUserModelFactory.create(builder.activityModule); this.mainActivityMembersInjector = MainActivity_MembersInjector.create((MembersInjector) MembersInjectors.noOp(), provideUserModelProvider); }/* * 进行注入 */ @Override public void inject(MainActivity activity) { mainActivityMembersInjector.injectMembers(activity); } public static final class Builder { ... }}
ActivityModule_ProvideUserModelFactory
Provides工厂,根据ActivityModule获取Person
@Generated("dagger.internal.codegen.ComponentProcessor")public final class ActivityModule_ProvideUserModelFactory implements Factory<Person> { private final ActivityModule module; public ActivityModule_ProvideUserModelFactory(ActivityModule module) { assert module != null; this.module = module; } @Override public Person get() { Person provided = module.provideUserModel(); if (provided == null) { throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method"); } return provided; } public static Factory<Person> create(ActivityModule module) { return new ActivityModule_ProvideUserModelFactory(module); }}
MainActivity_MembersInjector
作用:对@Inject注释的变量进行赋值
@Generated("dagger.internal.codegen.ComponentProcessor")public final class MainActivity_MembersInjector implements MembersInjector<MainActivity> { private final MembersInjector<AppCompatActivity> supertypeInjector; private final Provider<Person> personProvider; public MainActivity_MembersInjector(MembersInjector<AppCompatActivity> supertypeInjector, Provider<Person> personProvider) { assert supertypeInjector != null; this.supertypeInjector = supertypeInjector; assert personProvider != null; this.personProvider = personProvider; } @Override public void injectMembers(MainActivity instance) { if (instance == null) { throw new NullPointerException("Cannot inject members into a null reference"); } supertypeInjector.injectMembers(instance); instance.person = personProvider.get(); //赋值给MainActivity.person } public static MembersInjector<MainActivity> create(MembersInjector<AppCompatActivity> supertypeInjector, Provider<Person> personProvider) { return new MainActivity_MembersInjector(supertypeInjector, personProvider); }}
多层依赖的情况
在多层依赖的情况下,最大的改变只是在MembersInjector的injectMembers中赋值部分添加了赋值的语句
@Overridepublic void injectMembers(MainActivity instance) { if (instance == null) { throw new NullPointerException("Cannot inject members into a null reference"); } supertypeInjector.injectMembers(instance); //以下为多层依赖情况下的赋值 instance.person = personProvider.get(); instance.shoppingCart = shoppingCartProvider.get();}
0 0
- Dagger2生成代码解析
- Dagger2 生成代码学习
- Dagger2的自动代码生成问题
- 告别Dagger2模板代码:DaggerAndroid原理解析
- dagger2结合apt自动生成注入代码搭建mvp
- 带你解析Dagger2
- dagger2框架解析
- android:mvp+dagger2解析
- Dagger2全面解析
- Dagger2 使用+原理解析
- Dagger2使用解析
- Dagger2 入门解析
- Dagger2代码分析
- 代码生成工具原理解析
- Unity3D工程生成代码解析
- 解析表格生成lua代码
- 二维码生成和解析代码
- Dagger2
- 【Unity3D游戏开发】WWW工具类简单的HTTP访问 (三四)
- android代码上库流程
- 纯真IP数据库格式详解
- C语言二叉排序数算法
- CDOJ 1297 bank
- Dagger2生成代码解析
- 搭建react-native for android的windows开发环境
- mybatis学习笔记
- Android Studio的常用设置
- 赫夫曼树
- c++中的关键字--static,this,virtual,volatile与operator
- JavaScript 惰性载入函数
- CDOJ 1299 Date
- 常用排序算法