前言
考虑到这块代码的复杂性,我们以当前ProcessorComponent节点生成DaggerComponentProcessor_ProcessorComponent作为demo案例讲解。
在讲解前,我们必须先把路由图整理出来,该路由图的作用是依赖的关联生成对应的变量和代码块:
component代码实现核心在关系图文件夹下,灰常灰常重要
- 在熟悉下面demo前务必认真、多次、对照前面的关系图去理解当前路由图。
component代码生成器是ComponentGenerator类,该类的topLevelTypes执行componentImplementation.generate()完成代码生成逻辑,如下:
public TypeSpec generate() {
return componentShard.generate();
}
如上代码所示,这里的componentShared(ShardImplementation类)表示当前正在处理的component碎片,也可以理解为每一个再处理的component节点会有一个ShardImplementation类作为碎片处理器。
下面对照ShardImplementation的generate理解component代码逻辑的生成.
ShardImplementation的generate完成component代码逻辑的生成
生成了DaggerComponentProcessor_ProcessorComponent类,讲解过程中细节方面自行对照该类进行理解。
一 生成类名
**目标实现:**生成了DaggerComponentProcessor_ProcessorComponent作为类名。
代码逻辑:
-
classBuilder(name),创建一个name的类; -
name参数是通过ShardImplementation构造函数传递过来的参数; -
在ComponentImplementation构造函数中新建ShardImplementation时,componentNames.get(graph.componentPath())就是name参数的值;
@Inject ComponentImplementation(...){ ... this.componentShard = new ShardImplementation(componentNames.get(graph.componentPath())); ... } -
ComponentNames.get方法获取生成的component节点生成的类名,这里我们知道使用的是
rootName:ClassName get(ComponentPath componentPath) { return componentPath.atRoot() ? rootName //父节点生成的名称.currentComponent + "Impl" : rootName.nestedClass(namesByPath.get(componentPath) + "Impl"); } -
rootName在ComponentNames构造函数中实现:@Inject
ComponentNames(
@TopLevel BindingGraph graph,
KeyFactory keyFactory
) {
this.rootName = getRootComponentClassName(graph.componentDescriptor());
…
} -
如下代码可以看到生成component节点的类规则:
public static ClassName getRootComponentClassName(ComponentDescriptor componentDescriptor) { checkState(!componentDescriptor.isSubcomponent()); ClassName componentName = ClassName.get(componentDescriptor.typeElement()); return ClassName.get(componentName.packageName(), "Dagger" + classFileName(componentName)); }
- 生成的类在当前component节点同一个包下,并且类名是 “Dagger” + 当前component节点父类一级级的以"_"作为分隔符拼接到component节点,例如
DaggerComponentProcessor_ProcessorComponent
##二 当前生成的Component类继承component节点 ##
目标实现:
当前DaggerComponentProcessor_ProcessorComponent继承ProcessorComponent节点:
DaggerComponentProcessor_ProcessorComponent implements ComponentProcessor.ProcessorComponent
代码逻辑
TypeSpecs.addSupertype(builder, graph.componentTypeElement());
##三 生成Creator内部类 ##
目标实现:
生成一个Factory类继承ComponentProcessor.ProcessorComponent.Factory:
private static final class Factory implements ComponentProcessor.ProcessorComponent.Factory {
@Override
public ComponentProcessor.ProcessorComponent create(XProcessingEnv xProcessingEnv,
ImmutableSet<BindingGraphPlugin> externalPlugins) {
Preconditions.checkNotNull(xProcessingEnv);
Preconditions.checkNotNull(externalPlugins);
return new DaggerComponentProcessor_ProcessorComponent(xProcessingEnv, externalPlugins);
}
}
代码逻辑:
-
调用addCreator()方法;
-
调用ComponentCreatorImplementationFactory.create用于生成creator内部类,并且存储于ComponentCreatorImplementation对象。这里调用的是BuilderForCreatorDescriptor对象的build方法:
-
(0)生成的creator类名:
-
① componentImplementation.getCreatorName():调用getCreatorName方法获取;
-
② componentNames.getCreatorName(graph.componentPath())调用getCreatorName方法获取creator类名,如下所示表示生成当前DaggerComponentProcessor_ProcessorComponent内部类
rootName.nestedClass(creatorNamesByPath.get(componentPath)) -
③ creatorNamesByPath变量在ComponentNames类构造函数中定义,调用creatorNamesByPath方法,该方法作用:实现Factory模式下使用Factory作为类名,Builder模式下使用Builder作为类名,所以当前生成的类名为:Factory
-
(1)setModifiers():修饰符
private static final -
(2)setSupertype():当前creator节点继承
ComponentProcessor.ProcessorComponent.Factory -
(3)addConstructor():添加构造函数,如果当前不存在父级component,那么使用默认构造函数,这里不另外生成;
-
(4)this.fields = addFields():添加变量,这里针对的是Builder模式下的setterMethod方法的参数,当前是Factory模式,所以该变量为空;
-
(5)addSetterMethods():Builder模式下的setterMethod方法在Creator类中创建新的方法,当前是Factory模式,所以这里没有实现;
-
(6) addFactoryMethod():Factory模式下的方法或Builder模式下的buildMethod方法用于业务逻辑实现。这里针对Factory做如下操作:
-
① factoryMethodBuilder():重写
create方法,方法类型是ComponentProcessor.ProcessorComponent -
②
create修饰符和返回类型:public修饰,方法返回类型是ComponentProcessor.ProcessorComponent -
③ factoryMethodParameters():
create方法参数,沿用ProcessorComponent.Factory的create方法参数 -
④
create方法添加代码块: -
④a:对参数加上notNull处理:
Preconditions.checkNotNull(xProcessingEnv); Preconditions.checkNotNull(externalPlugins); -
④b:创建DaggerComponentProcessor_ProcessorComponent对象,代码块:
return new DaggerComponentProcessor_ProcessorComponent(xProcessingEnv, externalPlugins); -
以上生成ComponentCreatorImplementation对象:当前Factory类、Factory类名、变量(不存在变量)作为参数
- 将当前生成的ComponentCreatorImplementation对象存储在当前正在处理的
ProcessorComponent对应的ComponentImplementation对象的属性的ShardImplementation对象的typeSpecsMap集合中,TypeSpecKind类型使用COMPONENT_CREATOR表示。
##四 生成factoryMethod方法 ##
该方法的作用是实例化Factory对象。
**目标实现:**生成factory()方法
public static ComponentProcessor.ProcessorComponent.Factory factory() {
return new Factory();
}
业务逻辑:
-
判断当前是否是subcomponent节点,因为不是所以调用createRootComponentFactoryMethod方法;
-
在当前ProcessorComponent存在Factory情况下,生成一个方法factory方法;
-
(1)先校验,当前ProcessorComponent不能存在 方法名是factory&&factory方法无参&&没有使用static修饰 ,否则报错。还好我们存在的ProcessorComponent中的factory方法使用了static修饰了,否则即报错。
-
(2)生成的方法名是
factory,public static修饰,ComponentProcessor.ProcessorComponent.Factory作为返回类型,代码块return new Factory();
##五 生成InterfaceMethod接口方法 ##
这里的逻辑极其复杂,一定要先认真查看上面的路由关系图,是当前实现component代码实现核心的关系图。
当前方法的作用是重写ProcessorComponent的入口方法,并且对当前入口方法实现,并且该入口方法实现过程中的依赖的一步步实现。
目标实现:
-
重写入口方法:DaggerComponentProcessor_ProcessorComponent重写了inject方法;
@Override public void inject(ComponentProcessor processor) { injectComponentProcessor(processor); } -
入口方法的实现的代码块实现的方法:
injectComponentProcessor(processor)代码块实现的injectComponentProcessor方法;
-
(1)injectComponentProcessor方法的实现
@CanIgnoreReturnValue private ComponentProcessor injectComponentProcessor(ComponentProcessor instance) { ComponentProcessor_MembersInjector.injectInjectBindingRegistry(instance, (InjectBindingRegistry) injectBindingRegistryImplProvider.get()); ComponentProcessor_MembersInjector.injectFactoryGenerator(instance, sourceFileGeneratorOfProvisionBinding()); ComponentProcessor_MembersInjector.injectMembersInjectorGenerator(instance, sourceFileGeneratorOfMembersInjectionBinding()); ComponentProcessor_MembersInjector.injectProcessingSteps(instance, immutableListOfXProcessingStep()); ComponentProce

本文详细解析Dagger2组件(component)的代码生成逻辑,包括类名生成、类继承、Creator内部类创建以及component节点间的依赖关系。通过对ShardImplementation的generate方法的分析,揭示了DaggerComponentProcessor_ProcessorComponent类的生成过程,包括factory方法、接口方法的实现。同时,文章探讨了如何处理复杂的依赖关系,生成相应的代码块。
最低0.47元/天 解锁文章
3453

被折叠的 条评论
为什么被折叠?



