arouter-api version : 1.4.1
前言
到现在为止,ARouter 还有最后的依赖注入还没有解析过,那么今天就来深入探究一下其实现原理。
PS : 因为依赖注入的原理还比较简单,所以本篇篇幅会较短。
@Autowired解析
想要用 ARouter 实现依赖注入,需要在 Activity/Fragment 中加上
ARouter.getInstance().inject(this);
那么我们这个代码就成为了我们分析的入口了。
1 | public void inject(Object thiz) { |
ARouter 内部还是调用了 _ARouter 的 inject 方法。
1 | static void inject(Object thiz) { |
发现依赖注入和拦截器很相似,都是利用服务组件来完成的。依赖注入的服务组件叫 AutowiredService ,跟踪可以发现,它的实现类是 AutowiredServiceImpl 。
1 | @Route(path = "/arouter/service/autowired") |
其中 ISyringe 就是依赖注入抽取出来的接口,
1 | public interface ISyringe { |
那么 ISyringe 的实现类又是谁呢?答案就是在编译期自动生成的类 XXXX$$ARouter$$Autowired
,我们找 demo 中生成的 Test1Activity$$ARouter$$Autowired
来看看
1 | public class Test1Activity$$ARouter$$Autowired implements ISyringe { |
从上面自动生成的代码中看出来,依赖注入实际上内部还是使用 getIntent.getXxxExtra
的形式来赋值的(同理,Fragment 用的是getArguments().getXxx()
)。需要注意的是,@Autowired 修饰的字段不能是 private 的,不然在自动生成代码的时候会报错。
另外,上面的代码中有一个 SerializationService 是用来干什么的?其实 SerializationService 是 json 序列化用的。在 demo 中官方给出了一个实现类 JsonServiceImpl ,内部用的是阿里的 fastjson 。如果有需要自定义的童鞋,可以参照着 JsonServiceImpl 自己去实现。
结束
看到这,基本上 ARouter 依赖注入的东西就讲完了。
这一系列下来,ARouter 代码层面的流程都讲的差不多。剩下就是 gradle-plugin 和 compiler 这两个部分还没解析过,等时间了再给大家讲。
bye bye
v1.5.2