Skip to content

这是我非常喜欢的组件化方案,and一点小建议 #31

@razerdp

Description

@razerdp

首先感谢作者的思路,我认为这套方案非常对我胃口,几乎无缝切换各个组件而不需要重新sync gradle简直不要太赞~非常nice的说

其次关于url,我倒是认为可以通过某个组件专门用来解析然后分发调用各组件的接口service

这次接入的时候我没有直接选择AppJoint依赖,而是参考appjoint和Arouter的思路重新写了一遍AnnotationProcessor(原谅我不怎么会写gradle-plugins TAT),在重写的过程中发现了一些可以优化的地方:

  1. 关于依赖,在多模块下,虽说大家普遍都是在root.gradle里定义ext变量,但每个子项目的gradle里都得写一遍一样的代码块,其实这部分我认为都可以抽出来到root.gradle里统一管理,我这里采取的是在root.gradle里写subprojects 来管理:参考代码

  2. 关于ModuleSpec和AppSpec,读了源码感觉这两个注解似乎是为了保证module能够初始化而使用,但其实可以通过ContentProvider来进行Modules的初始化,官方大佬的LifeCycle就是这么玩的~所以我这个重构的代码里没有这两个方法,只有一个@ServiceImpl注解

  3. 关于Service的实现类,有没有一种可能会存在一个声明的Service有多个实现呢,为了兼顾这种情况,我在apt的时候解析的是HashMap<Class, SparseArray<Object>>,注解允许设定int值来决定一个tag,这样应该可以解决某个Service对应多个impl实现的问题(说不定还可以搞定优先级呢~)

  4. 关于拦截器,其实个人感觉拦截器完全可以自己在Router模块里实现的。。。不过如果有库能提供也许会更好哈哈

  5. 关于多个module组合,其实这个在我们项目里是直接预留了一个test的application,需要组合哪些就直接依赖对应的module,所以其实感觉这个问题不大

  6. 关于组件的初始化顺序,有时候不排除会有这么一种可能:先初始化某个组件,再初始化另外一个组件(比如A组件后初始化B组件),这一块目前暂时没有很好(优雅)的想法,暂留一个坑

  7. 异想天开:因为在第二点里提到了provider,这货得在manifest里声明,在这里异想天开了一下:不知道能否编译期内写入到manifest里呢(利用占位?)这里我就暂时没有去探究了哈~不过幻想总是得有的

最后这里提供一下我这边实践的工程,因为思路是参照AppJoint的,所以没必要封装为库了,只是一个实现了上面除了拦截器的实践工程:Component

最后的最后,感谢作者大大的思路,真的很棒呢

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions