目录
以下代码为 spring boot 2.7.15 中自带的 spring 5.3.29
RequestMappingInfo
请求方法相关信息封装,对应的信息解析在 RequestMappingHandlerMapping 的 createRequestMappingInfo() 中实现。
对于 @RequestMapping 赋值的相关信息进行解析
protected RequestMappingInfo createRequestMappingInfo(
RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
RequestMappingInfo.Builder builder = RequestMappingInfo
.paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
.methods(requestMapping.method())
.params(requestMapping.params())
.headers(requestMapping.headers())
.consumes(requestMapping.consumes())
.produces(requestMapping.produces())
.mappingName(requestMapping.name());
if (customCondition != null) {
builder.customCondition(customCondition);
}
return builder.options(this.config).build();
}
HandlerMapping
实现类为 RequestMappingHandlerMapping
保存了请求路径与 RequestMappingInfo 的关系,最终在 AbstractHandlerMethodMapping 的内部类 MappingRegistry 中保存。
相关的路径信息在 AbstractHandlerMethodMapping 中实现,由于实现了接口 InitializingBean,在 spring ioc 容器创建完后进行 bean 初始化时进行路径解析处理,最终解析为 RequestMappingInfo 对象,保存到 AbstractHandlerMethodMapping 的内部类 MappingRegistry 中。
HandlerMethod
保存信息如下
bean
bean 名称
beanType
bean 类型
method
bridgeMethod
方法类型
HandlerAdapter
通过 AbstractHandlerMethodAdapter 的抽象方法 handleInternal() 最终调用 RequestMappingHandlerAdapter。
HttpServletBean 是 HttpServlet 的子类,其中定义了 initServletBean() 方法,此方法在子类 FrameworkServlet 中进行重写,其中定义了 onRefresh(),此方法在子类 DispatcherServlet 中进行重写,通过 initStrategies() 进行内部对象初始化处理,调用 initHandlerAdapters() 进行 HandlerAdapter 初始化处理。由于 FrameworkServlet 实现了接口 ApplicationContextAware,所以将 spring 的高级容器 ApplicationContext 传入到了 FrameworkServlet 的全局变量 webApplicationContext 中。
对应加载在 DispatcherServlet 中进行
FrameworkServlet
HttpServletBean
HandlerExecutionChain
handler
保存了 HandlerMethod 信息
interceptorList
HandlerInterceptor 实现类
请求过程通过 HandlerExecutionChain 中的 HandlerMethod 进行流转,最终请求在 InvocableHandlerMethod 中通过反射调用对应 controller 的方法。
先创建需要的对象封装为 bean 到 spring ioc 容器中,然后 servlet 容器启动后从 ApplicationContext 中获取对应的 bean 进行初始化处理,初始化处理结束后进行 http 请求和响应处理。