SpringBootWeb应用源码分析:综合实践与整体总结但是在实践的过程中,一些基础的组件并不能满足我们的实际需求。这时候我们就需要重新初始化相应的组件,甚至在一些极端的情况下,我们需要完全接管SpringBoot的默认配置。基于前端模板框架Thymeleaf的集成,本文将逐步向大家展示如何自定义ViewResolver,以及如何进一步扩展SpringMVC配置。本示例涉及集成Thymeleaf、自定义ThymeleafViewResolver和扩展SpringMVC。Thymeleaf是一个Java类库,可以处理HTML/HTML5、XML、JavaScript、CSS,甚至是纯文本文件。通常可以作为MVC中的View层,完全可以替代JSP。该框架是SpringBoot推荐的前端展示框架。首先我们创建一个集成Thymeleaf的SpringBootWeb项目。集成Thymeleaf的核心操作是引入对应的starter,对应项目中pom.xml的依赖如下。org.springframework.bootspring-boot-starter-thymeleaforg.springframework.boot弹簧-boot-starter-web通过前面的学习我们了解到,在引入starter后,SpringBoot会进行一个初始的基础配置,至此完成了Thymeleaf最简单的集成。关于页面我们暂时不考虑显示和基本配置。集成Thymeleaf后,Thymeleaf对应的自动配置类ThymeleafAutoConfiguration中会初始化一个ThymeleafViewResolver来解析和渲染Thymeleaf页面。这个操作和默认的BeanNameViewResolver本质上是一样的,都实现了ViewResolver接口。此时,如果官方提供的ThymeleafViewResolver的默认设置不能满足我们的需求,自定义设置有两种方式:通过应用配置文件进行配置和自己创建ThymeleafViewResolver对象。应用配置对应的属性定义位于ThymeleafProperties类中。类似的配置我们已经做过很多次了,就不赘述了。我们可以通过以下方式自己创建ThymeleafViewResolver对象。首先定义一个配置类ViewResolverConfig,通过类内部的@Bean注解将实例化的ThymeleafViewResolver对象注入到容器中。@ConfigurationpublicclassViewResolverConfig{@BeanpublicThymeleafViewResolverthymeleafViewResolver(){ThymeleafViewResolverresolver=newThymeleafViewResolver();//设置ViewResolver对应的属性值resolver.setCharacterEncoding("UTF-8");resolver.setCache(false);returnresolver会默认使用@MethodThymeleafViewResolver作为Bean的key,返回的Thymeleaf-ViewResolver对象作为Value存储在容器中。在方法内部,可以通过ThymeleafViewResolver对应的方法对属性进行初始化和设置。通过以上代码,我们完成了自定义Thymeleaf-ViewResolver的注入。那么,原来默认的ThymeleafViewResolver会做什么呢?我们知道,几乎所有的自动配置类都是通过注解来设置初始化条件的。比如ThymeleafViewResolver默认的实例化条件是当容器中不存在这个名字thymeleafViewResolver时会使用默认的。初始化。自定义ThymeleafViewResolver类初始化时,不再满足默认配置的初始化条件。以上解释了Thymeleaf的ViewResolver在SpringMVC中的定制。事实上,在SpringBoot中,大多数组件都可以通过相同的方式覆盖默认配置。除了上述方式,在SpringBoot项目中还可以通过实现WebMvcConfigurer接口实现更灵活的自定义配置。通过WebMvcConfigurer接口实现自定义配置是Spring内部的一种配置方式,替代了传统的XML配置。通过实现该接口的具体方法,可以自定义Handler、Interceptor、ViewResolver、MessageConverter等一些参数。以上面ThymeleafViewResolver的配置为例,我们也可以通过实现该接口的configureViewResolvers方法进行配置,达到同样的效果。具体示例代码如下:@ConfigurationpublicclassMyMvcConfigimplementsWebMvcConfigurer{@OverridepublicvoidconfigureViewResolvers(ViewResolverRegistryregistry){ThymeleafViewResolverresolver=newThymeleafSetView/ResolverView/Resolver对应的属性值resolver.setCharacterEncoding("UTF-8");resolver.setCache(false);registry.viewResolver();}}使用WebMvcConfigurer接口时,注意SpringBoot版本。以上代码基于SpringBoot2.0及之后的版本。WebMvcConfigurer接口还提供了其他用于扩展SpringMVC配置的接口。使用方法与上例基本相同。大家可以参考相应的代码进一步理解,这里就不一一举例了。最后,关于SpringMVC自定义配置最彻底的操作就是完全接管SpringBoot关于SpringMVC的默认配置。具体操作是在WebMvcConfigurer的实现类上使用@EnableWebMvc注解,如下所示。@EnableWebMvc@ConfigurationpublicclassMyMvcConfigimplementsWebMvcConfigurer{使用该注解相当于扩展了WebMvcConfigurationSupport,但是没有重写方法,需要的功能需要开发者自己实现。-一般来说,不推荐这种方法。这种方式比较适合在SpringBoot提供的默认配置的基础上针对特殊需求进行针对性扩展的场景。其实本节的重点不只是让大家学习简单的Web自定义配置,更深层次的意图是希望大家能够了解在SpringBoot默认的自动配置的基础上,我们可以通过哪些方式,如何进行自定义扩展.本节提到的例子中没有列出的内容,大家可以根据所学的思路进行练习。总结本文重点介绍了SpringBoot中Web应用的自动配置和SpringMVC的自动配置,并以SpringMVC中的一些典型配置为例进行源码讲解。其实围绕Web应用有一系列的自动配置,比如HttpEncodingAutoConfigurationMultipartAutoConfiguration和HttpMessageConvertersAutoConfiguration。我们只需要了解自动配置的本质:这些相关的配置无非就是将Bean的配置通过xml转化为基于类的配置。读者可以按照上述方法阅读分析其他Web相关的配置项。