2.13 Java SPI & WMRouter解析
less than 1 minute read
2.13.1 SPI
SerivceLoader#load()
-> LazyIterator#hasNext()
-> Classloader#getSystemResource
查找META-INF/services/
目录下的Java文件
-> ServiceLoader#parse()
读取解析Java文件
-> LazyIterator#next()
-> Class#forName()
创建实例
2.13.2 WMRouter
- 注解生成
PageAnnotationProcessor
(RegexAnnotationProcessor
、UriAnnotationProcessor
类似)
-> 查找RouterPage.class
注解的类,
-> 生成PageAnnotationInit_xxx
Java类, 类包含init
方法
-> #init
方法则调用PageAnnotationHandler#register
注册子handler, handler参考URI分发
ServiceAnnotationProcessor
-> 查找RouterService.class
注解的类,
-> 生成ServiceInit_xxx
Java类, 类包含init
方法
-> #init
方法则包含ServiceLoader#put()
注入相关class
文件
- SPI
- 自定义
SerciceLoader
-> LazyInitHelper#doInit()
-> Class#forName(SERVICE_LOADER_INIT)
加载com.sankuai.waimai.router.generated.service.ServiceLoaderInit
目录下的ServiceInit_xxx
Java类
-> Class.forName(Const.SERVICE_LOADER_INIT).getMethod(Const.INIT_METHOD).invoke(null);
调用相关init
方法进行初始化..
SerciceLoader#get()
-> SerciceLoader#get()
-> SerciceLoader#createInstance()
-> 获取IFactory
工厂类RouterComponents#getDefaultFactory
-> IFactory#create()
-> ProviderPool#create()
-> 查找RouterProvider
注解的方法, 通过该类的provideXxx
方法返回实例
- Router, URI分发
->
UriRequest#start
-> Router#startUri()
-> RootUriHandler#startUri()
-> RootUriHandler#handle()
即调用UriHandler#handle()
-> UriHandler#shouldHandle()
是否处理给定请求
-> ChainedInterceptor#intercept()
, 拦截处理请求, 链式拦截器, 逐步传递, 返回UriCallback#onComplete()
则结束, 否则UriCallback#onNext()
-> UriCallback#onNext()
-> ChainedHandle#handleInternal()
链式调用UriHandler#handle()
, 而RootUriHandler
的子handler则在初始化已创建, 即PageAnnotationHandler
、UriAnnotationHandler
、RegexAnnotationHandler
-> PageAnnotationHandler#handlerInternal()
则调用通过RouterPage.class
注解生成的相关UriHandler
类, 相关类在SerciceLoader.LazyInitHelper#doInit()
和注解流程已调用PageAnnotationHandler#register
注册子handler方法
- 即
UriRequest
-> Interceptor
-> RootUriHandler
-> Interceptor
-> PageAnnotationHandler
-> Interceptor
-> 用户自定义Handler
, 流程如官方流程图所示,