2.13 Java SPI & WMRouter解析

less than 1 minute read

2.13.1 SPI

  1. SerivceLoader#load() -> LazyIterator#hasNext() -> Classloader#getSystemResource查找META-INF/services/目录下的Java文件 -> ServiceLoader#parse()读取解析Java文件 -> LazyIterator#next() -> Class#forName()创建实例

2.13.2 WMRouter

  1. 注解生成
    • PageAnnotationProcessorRegexAnnotationProcessorUriAnnotationProcessor类似) -> 查找RouterPage.class注解的类, -> 生成PageAnnotationInit_xxxJava类, 类包含init方法 -> #init方法则调用PageAnnotationHandler#register注册子handler, handler参考URI分发
    • ServiceAnnotationProcessor -> 查找RouterService.class注解的类, -> 生成ServiceInit_xxxJava类, 类包含init方法 -> #init方法则包含ServiceLoader#put()注入相关class文件
  2. 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方法返回实例
  3. 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则在初始化已创建, 即PageAnnotationHandlerUriAnnotationHandlerRegexAnnotationHandler -> PageAnnotationHandler#handlerInternal()则调用通过RouterPage.class注解生成的相关UriHandler类, 相关类在SerciceLoader.LazyInitHelper#doInit()和注解流程已调用PageAnnotationHandler#register注册子handler方法
    • UriRequest-> Interceptor -> RootUriHandler -> Interceptor -> PageAnnotationHandler -> Interceptor -> 用户自定义Handler, 流程如官方流程图所示, Router流程图