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_xxxJava类, 类包含init方法
-> #init方法则调用PageAnnotationHandler#register注册子handler, handler参考URI分发
ServiceAnnotationProcessor
-> 查找RouterService.class注解的类,
-> 生成ServiceInit_xxxJava类, 类包含init方法
-> #init方法则包含ServiceLoader#put()注入相关class文件
- SPI
- 自定义
SerciceLoader
-> LazyInitHelper#doInit()
-> Class#forName(SERVICE_LOADER_INIT) 加载com.sankuai.waimai.router.generated.service.ServiceLoaderInit目录下的ServiceInit_xxxJava类
-> 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, 流程如官方流程图所示,
