自定义资源处理器
DispatcherServlet
会拦截所有请求,针对js
,css
等静态资源文件,我们不期望被controller
拦截,通过重写WebMvcConfigurationSupport
的addResourceHandlers
方法,由拦截指定规则的请求 url。代码如下
1 | package com.li.springboot.config; |
源码分析
SpringBoot
拦截 url,根据HandlerMapping
找到对应的Handler
去执行相关操作。
DispatcherServlet
初始化时会调用初始化方法时会加载HandlerMapping
1 | private void initHandlerMappings(ApplicationContext context) { |
WebMvcConfigurationSupport
的方法resourceHandlerMapping
中注解了@Bean
,所以自定义的资源处理器类得以被加载
1 |
|
重写的方法new
了ResourceHandlerRegistration
1 | public ResourceHandlerRegistration addResourceHandler(String... pathPatterns) { |
返回到WebMvcConfigurationSupport
方法resourceHandlerMapping
的registry.getHandlerMapping()
中,
1 | protected AbstractHandlerMapping getHandlerMapping() { |
ResourceHandlerRegistration
的getRequestHandler
1 | protected ResourceHttpRequestHandler getRequestHandler() { |
那么我们现在只需要搞清楚ResourceHttpRequestHandler
中的方法是如何被调用即可。
SpringBoot
或者SpringMVC
的请求由DispatcherServlet
拦截所有请求,实现了Servlet
标准。那么我们从service
方法入口即可
DispatcherServlet
的父类FrameworkServlet
重写了service
方法
1 | protected void service(HttpServletRequest request, HttpServletResponse response) |
processRequest
方法中,实际由DispatcherServlet
实现的方法doService
去处理。而doService
最终调用doDispatch
方法
1 | protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { |
我们查看具体查找mappedHandler
的具体实现,
1 | protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { |
接着我们查看查找具体handlerAdapter
的具体实现
1 | protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { |
handlerAdapter
调用handle
,对于HttpRequestHandlerAdapter
来说,
1 |
|
那么根据doDispatch
中传入的handler
即则为ResourceHttpRequestHandler
,我们可以看到资源文件的具体加载过程。
1 |
|