SpringBootWeb源码解析SpringMVC自动配置( 三 )
xt applicationContext,
FormattingConver
sionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvide
r) {
//构造 welcomePageHandLerMapping 对象
WelcomePageHandlerMapping
we
lcomePageHandlerMapping
=
new
WelcomePageHand
ler-
Mapping(
new TemplateAvailabilityProviders (applicationContext), applicationConte
xt,
getWelcomePage(),
this . mvcProperties . getStaticPathPattern());
//设置拦截器
welcomePageHandlerMapping . setInterceptors(getInterceptors (mvcConversionSe
rvice, mvcResourceUrlProvider));
return welcomePageHandlerMapping;
//获取默认查找 index. html 的路径数组
static String[] getResourceLocations (String[] staticLocations) {
String[] locations = new String[staticLocations . length
SERVLET_ _LOCATIONS. length];
System. arraycopy(staticLocations, 0, locations, 0, staticLocations. lengt
h);
System. arraycopy(SERVLET_ LOCATIONS, 0, locations, staticLocat ions . length,
SERVLET_ LOCATIONS. length);
return locations;
}
//遍历资源路径并拼接每个路径下的 index. htmL 文件 , 过德出可用的 index. htmL 文件
private Optional
String[] locations = getResourceLocations (
this . resourceProperties . getStaticLocations());//转换并筛选出符合条件的第一个
return Arrays . stream(locations ) . map(this: :getIndexHtml)
. filter(this: :isReadable). findFirst();
}
//获取欢迎页资源的名称:路经+ index. html
private Resource getIndexHtml (String location) {
return this . resourceLoader . getResource(location + "index. html");
}
关于以上代码 , 我们首先看 WelcomePageHandlerMapping 类, 该类本身就是为欢迎页面量身定做的 , 实现了抽象类 AbstractUrlHandlerMapping 。 该类的构造方法接收以下 4 个参数 。
-TemplateAvailabilityProviders: TemplateAvailabilityProvider 的 Bean 的集合 , 可用于检查哪 些 ( 如 果 有 ) 模 板 引 擎 支 持 给 定 的 视 图。默 认 支 持 缓 存 响 应,除 非 将spring.template .provider.cache 属性设置为 false 。
:ApplicationContext:为应用程序提供配置的控制接口 。 在应用程序运行时 , 它是只读的 , 但是如果实现类支持 , 则可以重新加载 。
.Optional : index.html 对 应的 Resource , 主要通过上述代码中的 getWelcome-Page 方法获得 。
:String staticPathPattern:静态资源路径表达式 , 默认为“/**” , 值定义于 WebMvc- Properties中 。
我们再简单看一下 WelcomePageHandlerMapping 类构造方法中的业务逻辑处理源码 。
final class WelcomePageHandlerMapping extends AbstractUrlHandlerMapping {
WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabil
ityProviders ,
ApplicationContext applicationContext, Optional
String staticPathPattern) {
if (welcomePage . isPresent()
setRootVi ewName("forward: index . html");
} else if (welcomeTemplateExists (templateAvailabilityProviders, applica
tion-
Context)) {
logger. info("Adding welcome page template: index");
setRootViewName(" index") ;
}
}
}
WelcomePageHandlerMapping的构造方法中处理了两个分支判断:当index.html资源存在 , 并且静态资源路径为“**”时 , 设置 RootView 的名称为“forward:index.html" 。 也就是说会跳转到 index.html 页面 。 如果不满足上述情况 , 再判断是否存在欢迎模板页面 , 如果存在 , 则设置 RootView 为 index 。
另外 , 在获取 WelcomePageHandlerMapping 的 Optional
这些路径的定义同样位于上节提到的 ResourceProperties 类中 。 如果有多个 index.html 文件存在于以上路径中 , 它们的优先级按照上面路径的顺序从高到低排列 。
关于 Spring MVC 配置的相关内容较多 , 以上只是针对在官方文档中提到的一些典型功能的代码实现和原理进行讲解 。 在学习 Spring MVC 相关自动配置时 , 把握住一个核心思路即可:
【SpringBootWeb源码解析SpringMVC自动配置】对照没有使用 Spring Boot 的场景 , 我们集成 MVC 需要进行哪些配置、涉 及哪些类 , 而Spring Boot 又是如何将其自动配置的 。
文章插图
本文给大家讲解的内容是SpringBootWeb应用源码解析:SpringMVC的自动配置
- 高像素|加持高像素只为解析力?vivo S7丛林秘境展对样张细节的要求更严苛
- Python源码阅读-基础1
- 什么是建造者模式?他在jdk、MyBatis源码怎么运用?
- 用了就停不下来,解析全网视频,不仅免费还能下载
- CANopen源码简单讲二
- 视频|短视频源码开发,一套成熟的短视频源码应该是这样的
- SpringBoot构造流程源码分析:Web应用类型推断
- 详解mysql执行计划
- 构造流程源码分析:ApplicationListener加载
- 在美国当快递小哥赚钱吗?西瓜视频解析除了努力,运气也很重要