SpringBootWeb源码解析SpringMVC自动配置( 二 )


if (!context. isTypeMatch(viewName, View. class)) {
if (logger . isDebugEnabled()) {
logger. debug("Found bean named '”+ viewName +”' but it does not i
mplement View");
return null;
}
返回上下文中指定名称的 View 类型的 Bean
return context . getBean(viewName, View. class);
}
BeanNameViewResolver 的 resolveViewName 方法首先通过名称判断对应视图是否存在 , 当通过名称无法匹配时 , 会通过类型进行视图判断 , 如果存在对应的 Bean,则获取对应的View 对象并返回 。
SpringBootWeb源码解析SpringMVC自动配置文章插图
静态资源的支持
前端页面往往需要访问到静态资源 , SpringBoot 对静态资源(比如图片、CSS、JS 等)的支持,也 包 括 对 webjars 的 支 持,主 要 是 通 过 实 现 接 口 WebMvcConfigurer 的addResource-Handlers 方法来完成的 。
WebMvcConfigurer 的接口实现类为 WebMvcAutoConfiguration 的内部类 , 这样设计的主要目的是确保 WebMvcConfigurer 不在类路径中时不会读取 WebMvcConfigurer 的实现类 。
这里的内部实现类为 WebMvcAutoConfigurationAdapter 。
而我们要讲的对静态资源的支持便是通过 WebMvcAutoConfigurationAdapter 实现接口WebMvcConfigurer 的 addResourceHandlers 方法来完成的 。
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
//如果默认资源处理器为不可用状态则返回
if (!this . resourceProperties. isAddMappings()) {
logger . debug("Default resource handling disabled");
return;
}
Duration cachePeriod = this . resourceProperties . getCache()- getPeriod();
CacheControl cacheControl = this. resourceProperties . getCache( )
. getCachecontrol() . toHttpCacheControl();
//针对 webjars 做了特殊的判断处理
if (!registry . hasMappingForPattern(" /webjars/**")) {
//如果不存在针对 webjars 的配置 ,则在此处添加 , 并没置默认路径等
customizeResourceHandlerRegistrat ion(registry
. addResourceHandler(" /webjars/**")
. addResourceLocations("classpath:/
META-INF/resources/webjars/")
. setCachePeriod(getSeconds (cachePe
riod))
. setCacheControl(cacheControl));
}
String staticPathPattern = this . mvcProperties . getStaticPathPattern();
//如果当前的 ResourceHandlerRegistry 里面资源映射没有"/**",则启用默认的静态资源处
理if (!registry. hasMappingForPattern(staticPathPattern)) {
customi zeResourceHandlerRegistration(
registry . addResourceHandler(staticPathPattern)
. addResourceLocations (getResourceLocations(
this. resourceProperties . getStaticLocations()))
. setCachePeriod(getSeconds( cachePeriod))
. setCacheControl(cacheControl));
}
}
以上代码中重点进行了 webjars 资源路径和静态资源路径等默认值的初始化 。 首先 , 如果判断当前 ResourceHandlerRegistry 中不存 在“/webjars/**”,则设置 webjars 的资源路径和缓存 配 置 为 默 认 值 ; 其 次,判 断 当 前 ResourceHandlerRegistry 是 否 存 在“/**”(getStaticPathPattern 方 法获得的默认值)映射 , 如果不存在 , 则使用默认的映射路径、资源路径和缓存配置 。
默 认 的 静态 资 源 映 射 路 径 在 ResourceProperties 类 中 定 义 ,在 上 面 的 代 码 中是 由resourceProperties 的 getStaticLocations()方法获得 。
ResourceProperties 中默认路径定义相关代码如下 。
@ConfigurationProperties(prefix = "spring . resources", ignoreUnknownFields =
false)
public class ResourceProperties{
private static final String[] CLASSPATH RESOURCE_ LOCATIONS = { "classpat
h: /META- INF/resources/",
"classpat
h:/resources/", "classpath:/static/", "classpath:/public/" };
private String[] staticLocations = CLASSPATH RESOURCE LOCATIONS;
至此我们可以看出 , Spring Boot 默认会加载 classpath:/META-
INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/路径下的静态资源 。 这是“约定”的一部分 , 也是为什么我们在实践中默认会将静态资源都放置在以上路径下 。
SpringBootWeb源码解析SpringMVC自动配置文章插图
静态 index.html
当 Spring Boot 的 web 项目启动时 , 会寻找默认的欢迎页面 。 下面我们来当 Spring Boot 的web 项目启动时 , 会寻找默认的欢迎页面 。 下面我们来看 Spring Boot 默认对静态 index.html的支持是如何实现的 。 该功能是在内部类 EnableWebMvcConfiguration 中通过 WelcomePageHandlerMapping来实现的 。 主要用来查找默认路径下的 index.html (或 index 模板)页面 , 并展示默认的欢迎页面 , 代码如下 。
@Bean
public We lcomePageHandlerMapping welcomePageHandlerMapping(ApplicationConte