spring boot便是一个大结构里边包含了许许多多的东西,其间spring便是最中心的内容之一,当然就包含spring mvc。spring mvc 是仅仅spring 处理web层恳求的一个模块。因而他们的联系大约便是这样:spring mvc < spring
理清SpringBoot与SpringMVC的联系
Spring 结构就像一个宗族,有许多衍生产品例如 boot、security、jpa等等。但他们的根底都是Spring 的 ioc和 aop ioc 供给了依靠注入的容器 aop ,处理了面向横切面的编程,然后在此两者的根底上完成了其他延伸产品的高档功用。
Spring MVC是依据 Servlet 的一个 MVC 结构 首要处理 WEB 开发的问题,因为 Spring 的装备十分杂乱,各种XML、 JavaConfig、hin处理起来比较繁琐。
所以为了简化开发者的运用,然后创造性地推出了Spring boot,约好优于装备,简化了spring的装备流程。
说得更简洁一些:Spring 开端运用“工厂办法”(DI)和“署理办法”(AOP)解耦运用组件。
咱们觉得挺好用,所以依照这种办法搞了一个 MVC结构(一些用Spring 解耦的组件),用开发 web 运用( SpringMVC )。
然后有发现每次开发都写许多样板代码,为了简化作业流程,所以开发出了一些“懒人整合包”(starter),这套便是 Spring Boot。
Spring MVC的功用Spring MVC供给了一种轻度耦合的办法来开发web运用。Spring MVC是Spring的一个模块,式一个web结构。
经过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web运用变得很简略。处理的问题范畴是网站运用程序或许服务开发——URL路由、Session、模板引擎、静态Web资源等等。
Spring Boot的功用Spring Boot完成了主动装备,降低了项目建立的杂乱度。
众所周知Spring结构需求进行许多的装备,Spring Boot引进主动装备的概念,让项目设置变得很简略。
Spring Boot自身并不供给Spring结构的中心特性以及扩展功用,仅仅用于快速、敏捷地开发新一代依据Spring结构的运用程序。也便是说,它并不是用来替代Spring的处理计划,而是和Spring结构紧密结合用于提高Spring开发者体会的东西。
一起它集成了许多常用的第三方库装备(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot运用中这些第三方库简直能够零装备的开箱即用(out-of-the-box),大部分的Spring Boot运用都只需求十分少数的装备代码,开发者能够愈加专心于事务逻辑。Spring Boot仅仅承载者,辅佐你简化项目建立进程的。假如承载的是WEB项目,运用Spring MVC作为MVC结构,那么作业流程和你上面描绘的是彻底相同的,因为这部分作业是Spring MVC做的而不是Spring Boot。对运用者来说,换用Spring Boot今后,项目初始化办法变了,装备文件变了,别的便是不需求独自装置Tomcat这类容器服务器了,maven打出jar包直接跑起来便是个网站,但你最中心的事务逻辑完成与事务流程完成没有任何改动。
所以,用最简练的言语归纳便是:
Spring 是一个“引擎”;
Spring MVC 是依据Spring的一个 MVC 结构 ;
Spring Boot 是依据Spring4的条件注册的一套快速开发整合包。
Spring MVC主动装备
Spring Boot为Spring MVC供给的auto-configuration适用于大大都运用,并在Spring默许功用上增加了以下特性:
- 引进ContentNegotiatingViewResolver和BeanNameViewResolver beans。
- 对静态资源的支撑,包含对WebJars的支撑。
- 主动注册Converter,GenericConverter,Formatter beans。
- 对HttpMessageConverters的支撑。
- 主动注册MessageCodeResolver。
- 对静态index.html的支撑。
- 对自界说Favicon的支撑。
- 主动运用ConfigurableWebBindingInitializer bean。
假如保存Spring Boot MVC特性,你只需增加其他的MVC装备(拦截器,格局化处理器,视图操控器等)。你能够增加自己的WebMvcConfigurerAdapter类型的@Configuration类,而不需求注解@EnableWebMvc。假如期望运用自界说的RequestMappingHandlerMapping,RequestMappingHandlerAdapter,或ExceptionHandlerExceptionResolver,你能够声明一个WebMvcRegistrationsAdapter实例供给这些组件。
假如想全面操控Spring MVC,你能够增加自己的@Configuration,并运用@EnableWebMvc注解。
HttpMessageConverters
Spring MVC运用HttpMessageConverter接口转化HTTP恳求和呼应,适宜的默许装备能够开箱即用,例如目标主动转化为JSON(运用Jackson库)或XML(假如Jackson XML扩展可用,不然运用JAXB),字符串默许运用UTF-8编码。
能够运用Spring Boot的HttpMessageConverters类增加或自界说转化类:
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;
@Configuration
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter
HttpMessageConverter
return new HttpMessageConverters(additional, another);
}
}
上下文中呈现的一切HttpMessageConverter bean都将增加到converters列表,你能够经过这种办法掩盖默许的转化器列表(converters)。
自界说JSON序列化器和反序列化器
假如运用Jackson序列化,反序列化JSON数据,你或许想编写自己的JsonSerializer和JsonDeserializer类。自界说序列化器(serializers)一般经过Module注册到Jackson,但Spring Boot供给了@JsonComponent注解这一替代办法,它能轻松的将序列化器注册为Spring Beans。
MessageCodesResolver
Spring MVC有一个完成战略,用于从绑定的errors发作用来烘托过错信息的过错码:MessageCodesResolver。Spring Boot会主动为你创立该完成,只需设置spring.mvc.message-codes-resolver.format特点为PREFIX_ERROR_CODE或POSTFIX_ERROR_CODE(具体检查DefaultMessageCodesResolver.Format枚举值)。
静态内容
默许状况下,Spring Boot从classpath下的/static(/public,/resources或/META-INF/resources)文件夹,或从ServletContext根目录供给静态内容。这是经过Spring MVC的ResourceHttpRequestHandler完成的,你能够自界说WebMvcConfigurerAdapter并覆写addResourceHandlers办法来改动该行为(加载静态文件)。
在单机web运用中,容器会发动默许的servlet,并用它加载ServletContext根目录下的内容以呼应那些Spring不处理的恳求。大大都状况下这都不会发作(除非你修正默许的MVC装备),因为Spring总能够经过DispatcherServlet处理这些恳求。
你能够设置spring.resources.staticLocations特点自界说静态资源的方位(装备一系列目录方位替代默许的值),假如你这样做,默许的欢迎页面将从自界说方位加载,所以只需这些途径中的任何地方有一个index.html,它都会成为运用的主页。
此外,除了上述规范的静态资源方位,有个例外状况是Webjars内容。任安在/webjars/**途径下的资源都将从jar文件中供给,只需它们以Webjars的格局打包。
注 假如你的运用将被打包成jar,那就不要运用src/main/webapp文件夹。虽然该文件夹是一般的规范格局,但它仅在打包成war的状况下起作用,在打包成jar时,大都构建东西都会默许疏忽它。
Spring Boot也支撑Spring MVC供给的高档资源处理特性,可用于铲除缓存的静态资源或对WebJar运用版别无感知的URLs。
假如想运用针对WebJars版别无感知的URLs(version agnostic),只需求增加webjars-locator依靠,然后声明你的Webjar。以jQuery为例,"/webjars/jquery/dist/jquery.min.js"实践为"/webjars/jquery/x.y.z/dist/jquery.min.js",x.y.z为Webjar的版别。
注 假如运用JBoss,你需求声明webjars-locator-jboss-vfs依靠而不是webjars-locator,不然一切的Webjars将解析为404。
以下的装备为一切的静态资源供给一种缓存铲除(cache busting)计划,实践上是将内容hash增加到URLs中,比方:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
注 完成该功用的是ResourceUrlEncodingFilter,它在模板运转期会重写资源链接,Thymeleaf,Velocity和FreeMarker会主动装备该filter,JSP需求手动装备。其他模板引擎还没主动支撑,不过你能够运用ResourceUrlProvider自界说模块宏或协助类。
当运用比方JavaScript模块加载器动态加载资源时,重命名文件是不可的,这也是供给其他战略并能结合运用的原因。下面是一个"fixed"战略,在URL中增加一个静态version字符串而不需求改动文件名:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/lib/
spring.resources.chain.strategy.fixed.version=v12
运用以上战略,JavaScript模块加载器加载"/js/lib/"下的文件时会运用一个固定的版别战略"/v12/js/lib/mymodule.js",其他资源依旧运用内容hash的办法。检查ResourceProperties获取更多支撑的选项。
欢迎页面
Spring Boot支撑静态和模板欢迎页面。它首要index.html在装备的静态内容方位中查找 文件。假如找不到,则会查找index模板。假如找到任何一个,它将主动用作运用程序的欢迎页面。、
自界说Favicon
Spring Boot favicon.ico在装备的静态内容方位和类途径的根目录(按此次序)中查找a 。假如存在这样的文件,它会主动用作运用程序的图标。
途径匹配和内容洽谈
Spring MVC能够经过检查恳求途径并将它匹配到运用程序中界说的映射(例如@GetMapping Controller办法上的注释),将传入的HTTP恳求映射到处理程序。
Spring Boot挑选默许禁用后缀办法匹配,这意味着恳求"GET /projects/spring-boot.json"不会匹配 @GetMapping("/projects/spring-boot")映射。这被以为是Spring MVC运用程序的 最佳实践。此功用在曩昔关于没有发送正确的“Accept”恳求标头的HTTP客户端来说十分有用; 咱们需求保证将正确的内容类型发送到客户端。现在,内容洽谈更牢靠。
还有其他一些办法能够处理不一致地发送恰当的“承受”恳求标头的HTTP客户端。咱们能够运用查询参数来保证相似的恳求"GET /projects/spring-boot?format=json" 将映射到@GetMapping("/projects/spring-boot")以下内容,而不是运用后缀匹配:
spring.mvc.contentnegotiation.favor-parameter = true
#咱们能够更改参数称号,默许为“格局”:
#spring.mvc.contentnegotiation.parameter-name = myparam
#咱们还能够经过以下办法注册其他文件扩展名/媒体类型:
spring.mvc.contentnegotiation.media-types.markdown = text / markdown 一号站平台注册-理清SpringBoot与SpringMVC的联系
假如您了解注意事项并依然期望运用程序运用后缀办法匹配,则需求进行以下装备:
spring.mvc.contentnegotiation.favor-path-extension = true
#您也能够将该功用约束为已知扩展
#spring.mvc.pathmatch.use-registered-suffix-pattern = true
#咱们还能够经过以下办法注册其他文件扩展名/媒体类型:
#spring.mvc.contentnegotiation.media-types.adoc = text / asciidoc
ConfigurableWebBindingInitializer
Spring MVC运用WebBindingInitializer为每个特别的恳求初始化相应的WebDataBinder,假如你创立自己的ConfigurableWebBindingInitializer @Bean,Spring Boot会主动装备Spring MVC运用它。
模板引擎
正如REST web服务,你也能够运用Spring MVC供给动态HTML内容。Spring MVC支撑各式各样的模板技能,包含Velocity, FreeMarker和JSPs,许多其他的模板引擎也供给它们自己的Spring MVC集成。
Spring Boot为以下的模板引擎供给主动装备支撑:
- FreeMarker
- Groovy
- Thymeleaf
- Velocity(1.4已不再支撑)
- Mustache
注:因为在内嵌servlet容器中运用JSPs存在一些已知的约束,所以主张尽量不运用它们。
运用以上引擎中的任何一种,并选用默许装备,则模块会从src/main/resources/templates主动加载。
注:IntelliJ IDEA依据你运转运用的办法会对classpath进行不同的排序。在IDE里经过main办法运转运用,随从Maven,或Gradle,或打包好的jar中运转比较会导致不同的次序,这或许导致Spring Boot不能从classpath下成功地找到模板。假如遇到这个问题,你能够在IDE里从头对classpath进行排序,将模块的类和资源放到第一位。或许,你能够装备模块的前缀为classpath*:/templates/,这样会查找classpath下的一切模板目录。
过错处理
Spring Boot默许供给一个/error映射用来以适宜的办法处理一切的过错,并将它注册为servlet容器中大局的 过错页面。关于机器客户端(相关于浏览器而言,浏览器偏重于人的行为),它会发作一个具有具体过错,HTTP状况,反常信息的JSON呼应。关于浏览器客户端,它会发作一个白色标签款式(whitelabel)的过错视图,该视图将以HTML格局显现相同的数据(能够增加一个解析为'error'的View来自界说它)。为了彻底替换默许的行为,你能够完成ErrorController,并注册一个该类型的bean界说,或简略地增加一个ErrorAttributes类型的bean以运用现存的机制,仅仅替换显现的内容。
注BasicErrorController能够作为自界说ErrorController的基类,假如你想增加对新context type的处理(默许处理text/html),这会很有协助。你只需求一号站平台注册-理清SpringBoot与SpringMVC的联系承继BasicErrorController,增加一个public办法,并注解带有produces特点的@RequestMapping,然后创立该新类型的bean。
你也能够界说一个@ControllerAdvice去自界说某个特别controller或exception类型的JSON文档:
@ControllerAdvice(basePackageClasses = FooController.class)
public class FooControllerAdvice extends ResponseEntityExceptionHandler {
@ExceptionHandler(YourException.cl一号站平台注册-理清SpringBoot与SpringMVC的联系ass)
@ResponseBody
ResponseEntity
HttpStatus status = getStatus(request);
return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}
在以上示例中,假如跟FooController相同package的某个controller抛出YourException,一个CustomerErrorType类型的POJO的json展现将替代ErrorAttributes展现。
自界说过错页面
假如想为某个给定的状况码展现一个自界说的HTML过错页面,你需求将文件增加到/error文件夹下。过错页面既能够是静态HTML(比方,任何静态资源文件夹下增加的),也能够是运用模板构建的,文件名有必要是清晰的状况码或一系列标签。
例如,映射404到一个静态HTML文件,你的目录结构或许如下:
src/
+- main/
+- java/
| +
+- resources/
+- public/
+- error/
| +- 404.html
+-
运用FreeMarker模板映射一切5xx过错,你需求如下的目录结构:
src/
+- main/
+- java/
| +
+- resources/
+- templates/
+- error/
| +- 5xx.ftl
+-
关于更杂乱的映射,你能够增加完成ErrorViewResolver接口的beans:
public class MyErrorViewResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request,
HttpStatus status, Mapmodel) {
// Use the request or status to optionally return a ModelAndView
return ...
}
}
你也能够运用Spring MVC特性,比方@ExceptionHandler办法和@ControllerAdvice,ErrorController将处理一切未处理的反常。
映射Spring MVC以外的过错页面
关于不运用Spring MVC的运用,你能够经过ErrorPageRegistrar接口直接注册ErrorPages。该笼统直接作业于底层内嵌servlet容器,即便你没有Spring MVC的Dispatche一号站平台注册-理清SpringBoot与SpringMVC的联系rServlet,它们依旧能够作业。
@Bean
public ErrorPageRegistrar errorPageRegistrar(){
return new MyErrorPageRegistrar();
}
// ...
private static class MyErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
}
}
注.假如你注册一个Err一号站平台注册-理清SpringBoot与SpringMVC的联系orPage,该页面需求被一个Filter处理(在一些非Spring web结构中很常见,比方Jersey,Wicket),那么该Filter需求清晰注册为一个ERROR分发器(dispatcher),例如:
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;
}
(默许的FilterRegistrationBean不包含ERROR dispatcher类型)。
WebSphere运用服务器的过错处理
当布置到一个servlet容器时,Spring Boot经过它的过错页面过滤器将带有过错状况的恳求转发到恰当的过错页面。request只要在response还没提交时才干转发(forwarded)到正确的过错页面,而WebSphere运用服务器8.0及后续版别默许状况会在servlet办法成功履行后提交response,你需求设置com.ibm.ws.webcontainer.invokeFlushAfterService特点为false来封闭该行为。
Spring HATEOAS
假如正在开发依据超媒体的RESTful API,你或许需求Spring HATEOAS,而Spring Boot会为其供给主动装备,这在大大都运用中都运作杰出。 主动装备替代了@EnableHypermediaSupport,只需注册必定数量的beans就能轻松构建依据超媒体的运用,这些beans包含LinkDiscoverers(客户端支撑),ObjectMapper(用于将呼应编列为想要的办法)。ObjectMap天天看电影per能够依据spring.jackson.*特点或Jackson2ObjectMapperBuilder bean进行自界说。
经过注解@EnableHypermediaSupport,你能够操控Spring HATEOAS的装备,但这会禁用上述ObjectMapper的自界说功用。
CORS支撑
跨域资源共享(CORS)是一个大大都浏览器都完成了的W3C规范,它答应你以灵敏的办法指定跨域恳求怎么被授权,而不是选用那些不安全,功能低的办法,比方IFRAME或JSONP。
从4.2版别开端,Spring MVC对CORS供给开箱即用的支撑。不必增加任何特别装备,只需求在Spring Boot运用的controller办法上注解@CrossOrigin,并增加CORS装备。经过注册一个自界说addCorsMappings(CorsRegistry)办法的WebMvcConfigurer bean能够指定大局CORS装备:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}