原文地址:https://docs.spring.io/spring-boot/docs/current/reference/html/
Spring Boot可以轻松创建可以运行的独立的,生产级的基于Spring的应用程序。我们对Spring平台和第三方库进行了一种自以为是的观点,这样您就可以轻松上手了。大多数Spring Boot应用程序只需要很少的Spring配置。
您可以使用Spring Boot创建可以使用java -jar或更传统的war部署启动的Java应用程序 。我们还提供了一个运行“spring脚本”的命令行工具。
我们的主要目标是:
为所有Spring开发提供从根本上更快且可广泛访问的入门体验。
开箱即用,但随着需求开始偏离默认值而迅速摆脱困境。
提供大型项目(例如嵌入式服务器,安全性,度量标准,运行状况检查和外部化配置)通用的一系列非功能性功能。
绝对没有代码生成,也不需要XML配置。
Spring Boot与Apache Maven 3.3或更高版本兼容。如果您还没有安装Maven,可以按照maven.apache.org上的说明进行操作。
以下清单显示了一个典型pom.xml文件:
<?xml version =“1.0”encoding =“UTF-8”?>
4.0.0 modelVersion>
com.example groupId>
myproject artifactId>
0.0.1-SNAPSHOT version>
<! - 继承默认值为Spring Boot - >
org.springframework.boot groupId>
spring-boot-starter-parent artifactId>
2.1.0.RELEASE < / version>
parent>
<! - 添加Web应用程序的典型依赖项 - >
org.springframework.boot groupId>
spring-boot-starter-web artifactId>
dependency>
依赖>
<! - 作为可执行jar的包 - >
org.springframework.boot groupId>
spring-boot-maven-plugin artifactId>
plugin >
plugins>
build>
本节介绍如何开发一个简单的“Hello World!”Web应用程序,该应用程序突出了Spring Boot的一些主要功能。我们使用Maven来构建这个项目,因为大多数IDE都支持它。
我们需要从创建Maven pom.xml文件开始。本pom.xml是用来构建项目的配方。打开您喜欢的文本编辑器并添加以下内容:
<?xml version =“1.0”encoding =“UTF-8”?>
4.0.0 modelVersion>
com.example groupId>
myproject artifactId>
0.0.1-SNAPSHOT version>
org.springframework.boot groupId>
spring-boot-starter-parent artifactId>
2.1.0.RELEASE version>
parent>
<! - 这里要添加的其他行...... - >
上面的清单应该为您提供有效的构建。您可以通过运行来测试它mvn package(现在,您可以忽略“jar将为空 - 没有内容标记为包含!”警告)。
Spring Boot提供了许多“Starters”,可以将jar添加到类路径中。我们的示例应用程序已经spring-boot-starter-parent在parent POM部分中使用过。这spring-boot-starter-parent是一个特殊的启动器,提供有用的Maven默认值。它还提供了一个 dependency-management 部分,以便您可以省略version“祝福”依赖项的标记。
其他“Starters”提供了在开发特定类型的应用程序时可能需要的依赖项。由于我们正在开发Web应用程序,因此我们添加了 spring-boot-starter-web依赖项。在此之前,我们可以通过运行以下命令来查看当前的内容:
$ mvn依赖:树
[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
该mvn dependency:tree命令打印项目依赖项的树表示。您可以看到它spring-boot-starter-parent本身不提供依赖关系。要添加必要的依赖项,请编辑pom.xml并spring-boot-starter-web在该parent部分的正下方添加 依赖项:
org.springframework.boot groupId>
spring-boot-starter-web artifactId>
dependency>
dependencies>
如果mvn dependency:tree再次运行,您会发现现在有许多其他依赖项,包括Tomcat Web服务器和Spring Boot本身。
要完成我们的应用程序,我们需要创建一个Java文件。默认情况下,Maven编译源代码src/main/java,因此您需要创建该文件夹结构,然后添加一个名为src/main/java/Example.java包含以下代码的文件:
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
}
虽然这里的代码不多,但还是有很多代码。我们将在接下来的几节中逐步介绍重要部分。
11.3.1 @RestController和@RequestMapping注释
我们Example班上的第一个注释是@RestController。这被称为 构造型注释。它为阅读代码的人提供了提示,而对于Spring来说,该类扮演着特定的角色。在这种情况下,我们的类是一个Web @Controller,因此Spring在处理传入的Web请求时会考虑它。
该@RequestMapping注释提供“路由”的信息。它告诉Spring,任何带/路径的HTTP请求都应该映射到该home方法。该 @RestController注解告诉Spring使得到的字符串直接返回给调用者。
[注]
在@RestController与@RequestMapping注解是Spring MVC的注解。(它们不是特定于Spring Boot的。)有关更多详细信息,请参阅Spring参考文档中的MVC部分。
11.3.2 @EnableAutoConfiguration注释
第二个类级注释是@EnableAutoConfiguration。这个注释告诉Spring Boot根据你添加的jar依赖关系“猜测”你想要如何配置Spring。自从spring-boot-starter-web添加了Tomcat和Spring MVC 以来,自动配置假定您正在开发Web应用程序并相应地设置Spring。
启动器和自动配置
自动配置旨在与“启动器”配合使用,但这两个概念并不直接相关。您可以自由选择并在首发之外选择jar依赖项。Spring Boot仍然尽力自动配置您的应用程序。
11.3.3“main”方法
我们的应用程序的最后一部分是main方法。这只是遵循应用程序入口点的Java约定的标准方法。我们的main方法SpringApplication通过调用委托给Spring Boot的类run。 SpringApplication引导我们的应用程序,启动Spring,然后启动自动配置的Tomcat Web服务器。我们需要Example.class作为参数传递给run方法,以告诉SpringApplication哪个是主要的Spring组件。该 args数组也被传递以公开任何命令行参数。
此时,您的应用程序应该可以工作。由于您使用了 spring-boot-starter-parentPOM,run因此您可以使用一个有用的目标来启动应用程序。mvn spring-boot:run从根项目目录中键入以启动应用程序。您应该看到类似于以下内容的输出:
$ mvn spring-boot:run
如果您打开Web浏览器localhost:8080,您应该看到以下输出:
你好,世界!
启动器是一组方便的依赖关系描述符,您可以将其包含在应用程序中。您可以获得所需的所有Spring和相关技术的一站式服务,而无需查看示例代码和复制粘贴依赖描述符的负载。例如,如果要开始使用Spring和JPA进行数据库访问,请spring-boot-starter-data-jpa在项目中包含依赖项。
启动器包含许多依赖项,这些依赖项是使项目快速启动和运行所需的依赖项,以及一组受支持的托管传递依赖项。
名称是什么
所有官方首发都遵循类似的命名模式; spring-boot-starter-*,哪里*是特定类型的应用程序。此命名结构旨在帮助您找到启动器。许多IDE中的Maven集成允许您按名称搜索依赖项。例如,安装了适当的Eclipse或STS插件后,您可以按下ctrl-spacePOM编辑器并输入“spring-boot-starter”以获取完整列表。
正如“ 创建自己的启动器 ”一节中所述,第三方启动者不应该开头spring-boot,因为它是为官方Spring Boot工件保留的。相反,第三方启动器通常以项目名称开头。例如,thirdpartyproject通常会命名一个名为的第三方启动项目 thirdpartyproject-spring-boot-starter。
以下应用程序启动程序由Spring Boot在org.springframework.boot组下提供 :
Table 13.1. Spring Boot application starters
Name | Description | Pom |
---|---|---|
|
Core starter, including auto-configuration support, logging and YAML |
Pom |
|
Starter for JMS messaging using Apache ActiveMQ |
Pom |
|
Starter for using Spring AMQP and Rabbit MQ |
Pom |
|
Starter for aspect-oriented programming with Spring AOP and AspectJ |
Pom |
|
Starter for JMS messaging using Apache Artemis |
Pom |
|
Starter for using Spring Batch |
Pom |
|
Starter for using Spring Framework’s caching support |
Pom |
|
Starter for using Spring Cloud Connectors which simplifies connecting to services in cloud platforms like Cloud Foundry and Heroku |
Pom |
|
Starter for using Cassandra distributed database and Spring Data Cassandra |
Pom |
|
Starter for using Cassandra distributed database and Spring Data Cassandra Reactive |
Pom |
|
Starter for using Couchbase document-oriented database and Spring Data Couchbase |
Pom |
|
Starter for using Couchbase document-oriented database and Spring Data Couchbase Reactive |
Pom |
|
Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch |
Pom |
|
Starter for using Spring Data JDBC |
Pom |
|
Starter for using Spring Data JPA with Hibernate |
Pom |
|
Starter for using Spring Data LDAP |
Pom |
|
Starter for using MongoDB document-oriented database and Spring Data MongoDB |
Pom |
|
Starter for using MongoDB document-oriented database and Spring Data MongoDB Reactive |
Pom |
|
Starter for using Neo4j graph database and Spring Data Neo4j |
Pom |
|
Starter for using Redis key-value data store with Spring Data Redis and the Lettuce client |
Pom |
|
Starter for using Redis key-value data store with Spring Data Redis reactive and the Lettuce client |
Pom |
|
Starter for exposing Spring Data repositories over REST using Spring Data REST |
Pom |
|
Starter for using the Apache Solr search platform with Spring Data Solr |
Pom |
|
Starter for building MVC web applications using FreeMarker views |
Pom |
|
Starter for building MVC web applications using Groovy Templates views |
Pom |
|
Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS |
Pom |
|
Starter for using Spring Integration |
Pom |
|
Starter for using JDBC with the HikariCP connection pool |
Pom |
|
Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to |
Pom |
|
Starter for using jOOQ to access SQL databases. An alternative to |
Pom |
|
Starter for reading and writing json |
Pom |
|
Starter for JTA transactions using Atomikos |
Pom |
|
Starter for JTA transactions using Bitronix |
Pom |
|
Starter for using Java Mail and Spring Framework’s email sending support |
Pom |
|
Starter for building web applications using Mustache views |
Pom |
|
Starter for using Spring Security’s OAuth2/OpenID Connect client features |
Pom |
|
Starter for using Spring Security’s OAuth2 resource server features |
Pom |
|
Starter for using the Quartz scheduler |
Pom |
|
Starter for using Spring Security |
Pom |
|
Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito |
Pom |
|
Starter for building MVC web applications using Thymeleaf views |
Pom |
|
Starter for using Java Bean Validation with Hibernate Validator |
Pom |
|
Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container |
Pom |
|
Starter for using Spring Web Services |
Pom |
|
Starter for building WebFlux applications using Spring Framework’s Reactive Web support |
Pom |
|
Starter for building WebSocket applications using Spring Framework’s WebSocket support |
Pom |
In addition to the application starters, the following starters can be used to add production ready features:
Table 13.2. Spring Boot production starters
Name | Description | Pom |
---|---|---|
|
Starter for using Spring Boot’s Actuator which provides production ready features to help you monitor and manage your application |
Pom |
Finally, Spring Boot also includes the following starters that can be used if you want to exclude or swap specific technical facets:
Table 13.3. Spring Boot technical starters
Name | Description | Pom |
---|---|---|
|
Starter for using Jetty as the embedded servlet container. An alternative to |
Pom |
|
Starter for using Log4j2 for logging. An alternative to |
Pom |
|
Starter for logging using Logback. Default logging starter |
Pom |
|
Starter for using Reactor Netty as the embedded reactive HTTP server. |
Pom |
|
Starter for using Tomcat as the embedded servlet container. Default servlet container starter used by |
Pom |
|
Starter for using Undertow as the embedded servlet container. An alternative to |
Pom |
Spring Boot支持基于Java的配置。尽管可以使用 SpringApplicationXML源,但我们通常建议您的主要源是单个@Configuration类。通常,定义main方法的类是主要的候选者@Configuration。
[注]
许多Spring配置示例已在Internet上发布,使用XML配置。如果可能,请始终尝试使用等效的基于Java的配置。搜索Enable*注释可能是一个很好的起点。
你不需要把所有的@Configuration东西都放在一个班级里。所述@Import注释可以用于导入额外的配置类。或者,您可以使用 @ComponentScan自动获取所有Spring组件,包括 @Configuration类。
如果您绝对必须使用基于XML的配置,我们建议您仍然从一个@Configuration类开始。然后,您可以使用@ImportResource注释来加载XML配置文件。
Spring Boot自动配置尝试根据您添加的jar依赖项自动配置Spring应用程序。例如,如果HSQLDB 在您的类路径中,并且您尚未手动配置任何数据库连接bean,则Spring Boot会自动配置内存数据库。
您需要通过向其中一个类添加@EnableAutoConfiguration或 @SpringBootApplication注释来选择自动配置@Configuration。
[注]
您应该只添加一个@SpringBootApplication或@EnableAutoConfiguration 注释。我们通常建议您仅将一个或另一个添加到主 @Configuration类中。
自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置以替换自动配置的特定部分。例如,如果添加自己的DataSourcebean,则默认的嵌入式数据库支持会退回。
如果您需要了解当前正在应用的自动配置以及原因,请使用--debug交换机启动应用程序。这样做可以为选择的核心记录器启用调试日志,并将条件报告记录到控制台。
如果发现正在应用您不需要的特定自动配置类,则可以使用exclude属性@EnableAutoConfiguration禁用它们,如以下示例所示:
import org.springframework.boot.autoconfigure。*;
import org.springframework.boot.autoconfigure.jdbc。*;
import org.springframework.context.annotation。*;
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
如果类不在类路径上,则可以使用excludeName注释的属性并指定完全限定名称。最后,您还可以使用该spring.autoconfigure.exclude属性控制要排除的自动配置类列表 。
[注]
您可以在注释级别和使用属性定义排除项。
您可以自由地使用任何标准的Spring Framework技术来定义bean及其注入的依赖项。为简单起见,我们经常发现使用 @ComponentScan(找到你的bean)和使用@Autowired(做构造函数注入)效果很好。
如果按照上面的建议构建代码(在根包中定位应用程序类),则可以添加@ComponentScan不带任何参数的代码。您的所有应用程序组件(的@Component,@Service,@Repository,@Controller等)自动注册为豆。
以下示例显示了一个@Service使用构造函数注入来获取所需RiskAssessorbean的Bean:
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService实现 AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor){
this .riskAssessor = riskAssessor;
}
// ...
}
如果bean有一个构造函数,则可以省略@Autowired,如下例所示:
@Service
public class DatabaseAccountService实现 AccountService {
private final RiskAssessor riskAssessor;
public DatabaseAccountService(RiskAssessor riskAssessor){
this .riskAssessor = riskAssessor;
}
// ...
}
[注]
请注意使用构造函数注入如何将riskAssessor字段标记为 final,表示无法随后更改。
18.使用@SpringBootApplication Annotation
许多Spring Boot开发人员喜欢他们的应用程序使用自动配置,组件扫描,并能够在他们的“应用程序类”上定义额外的配置。@SpringBootApplication可以使用单个 注释来启用这三个功能,即:
@EnableAutoConfiguration:启用Spring Boot的自动配置机制
@ComponentScan:@Component在应用程序所在的程序包上启用扫描(请参阅最佳做法)
@Configuration:允许在上下文中注册额外的bean或导入其他配置类
的@SpringBootApplication注释是相当于使用@Configuration, @EnableAutoConfiguration以及@ComponentScan与他们的默认属性,如显示在下面的例子:
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication //与@Configuration@EnableAutoConfiguration @ComponentScan 同
public class Application {
public static void main(String [] args){
SpringApplication.run(Application .class,args);
}
}
[注]
@SpringBootApplication还提供了别名定制的属性 @EnableAutoConfiguration和@ComponentScan。
[注]
这些功能都不是必需的,您可以选择通过它启用的任何功能替换此单个注释。例如,您可能不希望在应用程序中使用组件扫描:
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@EnableAutoConfiguration @Import
({MyConfig.class,MyAnotherConfig.class})
public class Application {
public static void main(String [] args){
SpringApplication.run(Application .class,args);
}
}
在此示例中,Application与任何其他Spring Boot应用程序一样,除了 @Component未自动检测到注释类并且显式导入用户定义的bean(请参阅参考资料@Import)。
28.开发Web应用程序
Spring Boot非常适合Web应用程序开发。您可以使用嵌入式Tomcat,Jetty,Undertow或Netty创建自包含的HTTP服务器。大多数Web应用程序使用该spring-boot-starter-web模块快速启动和运行。您还可以选择使用该spring-boot-starter-webflux模块构建响应式Web应用程序 。
如果您还没有开发Spring Boot Web应用程序,可以按照“Hello World!”进行操作。“ 入门”部分中的示例 。
28.1“Spring Web MVC框架”
在spring Web MVC框架(通常简称为“spring MVC”)是一个丰富的“模型视图控制器” Web框架。Spring MVC允许您创建特殊@Controller或@RestControllerbean来处理传入的HTTP请求。控制器中的方法通过使用@RequestMapping注释映射到HTTP 。
以下代码显示了@RestController为JSON数据提供服务的典型代码:
@RestController
@RequestMapping(value =“/ users”)
public class MyRestController {
@RequestMapping(value =“/ {user}”,method = RequestMethod.GET)
public User getUser( @PathVariable Long user){
// ...
}
@RequestMapping(value =“/ {user} / customers”,method = RequestMethod.GET)
List getUserCustomers( @PathVariable Long user){
// ...
}
@RequestMapping(value =“/ {user}”,method = RequestMethod.DELETE)
public User deleteUser( @PathVariable Long user){
// ...
}
}
Spring MVC是核心Spring Framework的一部分,详细信息可在参考文档中找到。也有涵盖Spring MVC中提供一些指南spring.io/guides。
28.1.1 Spring MVC自动配置
Spring Boot为Spring MVC提供自动配置,适用于大多数应用程序。
自动配置在Spring的默认值之上添加了以下功能:
包含ContentNegotiatingViewResolver和BeanNameViewResolver豆类。
支持提供静态资源,包括对WebJars的支持( 本文档稍后介绍))。
自动注册Converter,GenericConverter和Formatter豆类。
支持HttpMessageConverters( 本文档后面部分)。
自动注册MessageCodesResolver( 本文档后面部分)。
静态index.html支持。
自定义Favicon支持(本文档后面部分介绍)。
自动使用ConfigurableWebBindingInitializerbean( 本文档稍后介绍)。
如果您想保留Spring Boot MVC功能并且想要添加其他 MVC配置(拦截器,格式化程序,视图控制器和其他功能),您可以添加自己@Configuration的类型 WebMvcConfigurer但不需要 @EnableWebMvc。如果您希望提供,或的 自定义实例RequestMappingHandlerMapping,则可以声明 实例以提供此类组件。RequestMappingHandlerAdapterExceptionHandlerExceptionResolverWebMvcRegistrationsAdapter
如果您想完全控制Spring MVC,可以添加自己的@Configuration 注释@EnableWebMvc。
28.1.2 HttpMessageConverters
Spring MVC使用该HttpMessageConverter接口转换HTTP请求和响应。明智的默认值包含在开箱即用中。例如,对象可以自动转换为JSON(通过使用Jackson库)或XML(如果可用,则使用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> additional = ...
HttpMessageConverter> another = ...
return new HttpMessageConverters(additional, another);
}
}
HttpMessageConverter上下文中存在的任何bean都将添加到转换器列表中。您也可以以相同的方式覆盖默认转换器。
28.1.3自定义JSON序列化程序和反序列化程序
如果您使用Jackson来序列化和反序列化JSON数据,您可能希望编写自己的类JsonSerializer和JsonDeserializer类。自定义序列化程序通常 通过模块向Jackson注册,但Spring Boot提供了另一种@JsonComponent注释,可以更容易地直接注册Spring Beans。
您可以@JsonComponent直接使用注释JsonSerializer或 JsonDeserializer实现。您还可以在包含序列化程序/反序列化程序作为内部类的类上使用它,如以下示例所示:
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import org.springframework.boot.jackson.*;
@JsonComponent
public class Example {
public static class Serializer extends JsonSerializer {
// ...
}
public static class Deserializer extends JsonDeserializer {
// ...
}
}
其中的所有@JsonComponent豆类都会ApplicationContext自动在杰克逊注册。因为@JsonComponent是元注释@Component,所以通常的组件扫描规则适用。
Spring Boot也提供 JsonObjectSerializer和 JsonObjectDeserializer基础类,序列化对象时提供标准版本的杰克逊有用的替代。见 JsonObjectSerializer 和JsonObjectDeserializer在Javadoc了解详情。
28.1.4 MessageCodesResolver
Spring MVC有一个生成错误代码的策略,用于从绑定错误中呈现错误消息:MessageCodesResolver。如果设置了 spring.mvc.message-codes-resolver.format财产PREFIX_ERROR_CODE或 POSTFIX_ERROR_CODE春季启动为您创建一个(见枚举 DefaultMessageCodesResolver.Format)。
28.1.5静态内容
默认情况下,Spring Boot从类路径中的/static( /public或/resources或/META-INF/resources)目录或者根目录中提供静态内容ServletContext。它使用ResourceHttpRequestHandler来自Spring MVC,以便您可以通过添加自己WebMvcConfigurer的addResourceHandlers方法来修改该行为并覆盖该 方法。
在独立的Web应用程序中,容器中的默认servlet也会启用并充当后备,从ServletContextif 的根目录提供内容,决定不处理它。大多数情况下,这不会发生(除非你修改默认的MVC配置),因为Spring总是可以通过它来处理请求 DispatcherServlet。
默认情况下,会映射资源/**,但您可以使用该spring.mvc.static-path-pattern属性对其进行调整 。例如,/resources/**可以按如下方式重新定位所有资源 :
spring.mvc.static-path-pattern = / resources / **
您还可以使用该spring.resources.static-locations属性自定义静态资源位置 (将默认值替换为目录位置列表)。根Servlet上下文路径"/"也会自动添加为位置。
除了前面提到的“标准”静态资源位置之外,还为Webjars内容制作了一个特例。具有路径的任何资源 /webjars/**都是从jar文件提供的,如果它们以Webjars格式打包的话。
[注]
src/main/webapp如果您的应用程序打包为jar,请不要使用该目录。虽然这个目录是一个通用的标准,它的工作原理只是战争的包装,它是默默大多数构建工具忽略,如果你生成一个罐子。
Spring Boot还支持Spring MVC提供的高级资源处理功能,允许使用缓存破坏静态资源或使用与Webjars无关的URL。
要为Webjars使用版本无关的URL,请添加webjars-locator-core依赖项。然后声明你的Webjar。以jQuery为例,添加 "/webjars/jquery/jquery.min.js"结果 "/webjars/jquery/x.y.z/jquery.min.js"。x.y.zWebjar版本在哪里。
[注]
如果你使用JBoss,你需要声明webjars-locator-jboss-vfs 依赖而不是webjars-locator-core。否则,所有Webjars都会解析为 404。
要使用缓存清除,以下配置会为所有静态资源配置缓存清除解决方案,从而有效地在URL中添加内容哈希,例如 :
spring.resources.chain.strategy.content.enabled = true
spring.resources.chain.strategy.content.paths = / **
[注]
由于ResourceUrlEncodingFilter为Thymeleaf和FreeMarker自动配置了资源链接,因此在运行时会在模板中重写这些链接 。您应该在使用JSP时手动声明此过滤器。其他模板引擎目前不是自动支持的,但可以使用自定义模板宏/帮助程序和使用 ResourceUrlProvider。
使用(例如)JavaScript模块加载器动态加载资源时,不能重命名文件。这就是为什么其他策略也得到支持并可以合并的原因。“固定”策略在URL中添加静态版本字符串而不更改文件名,如以下示例所示:
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"),而其他资源仍使用内容one()。
有关ResourceProperties 更多支持选项,请参阅
[注]
此功能已在专门的博客文章和Spring Framework的 参考文档中进行了详细描述 。
28.1.6欢迎页面
Spring Boot支持静态和模板化欢迎页面。它首先index.html在配置的静态内容位置中查找 文件。如果找不到,则查找index模板。如果找到任何一个,它将自动用作应用程序的欢迎页面。
28.1.7自定义Favicon
Spring Boot favicon.ico在配置的静态内容位置和类路径的根(按此顺序)中查找a 。如果存在这样的文件,它将自动用作应用程序的favicon。
28.1.8路径匹配和内容协商
Spring MVC可以通过查看请求路径并将其与应用程序中定义的映射(例如,@GetMapping Controller方法上的注释)相匹配,将传入的HTTP请求映射到处理程序。
Spring Boot默认选择禁用后缀模式匹配,这意味着请求"GET /projects/spring-boot.json"不会与@GetMapping("/projects/spring-boot")映射匹配 。这被认为是Spring MVC应用程序的 最佳实践。对于没有发送正确“接受”请求标头的HTTP客户端,此功能在过去主要有用; 我们需要确保将正确的内容类型发送给客户端。如今,内容协商更加可靠。
还有其他方法可以处理不一致发送正确“接受”请求标头的HTTP客户端。我们可以使用查询参数来确保将请求"GET /projects/spring-boot?format=json" 映射到@GetMapping("/projects/spring-boot")以下内容,而不是使用后缀匹配:
spring.mvc.contentnegotiation.favor-parameter = true
#我们可以更改参数名称,默认为“format”:
#spring.mvc.contentnegotiation.parameter-name = myparam
#我们还可以注册其他文件扩展名/媒体类型:
spring.mvc.contentnegotiation.media-types.markdown = text / markdown
如果您了解警告并仍希望您的应用程序使用后缀模式匹配,则需要以下配置:
spring.mvc.contentnegotiation.favor-path-extension = true
spring.mvc.pathmatch.use-suffix-pattern = true
或者,不是打开所有后缀模式,而是仅支持已注册的后缀模式更安全:
spring.mvc.contentnegotiation.favor-path-extension = true
spring.mvc.pathmatch.use-registered-suffix-pattern = true
#您还可以注册其他文件扩展名/媒体类型:
#spring.mvc.contentnegotiation.media-types.adoc = text / asciidoc
28.1.9 ConfigurableWebBindingInitializer
Spring MVC使用a WebBindingInitializer来初始化WebDataBinder特定请求。如果您自己创建ConfigurableWebBindingInitializer @Bean,Spring Boot会自动配置Spring MVC来使用它。
28.1.10模板引擎
除REST Web服务外,您还可以使用Spring MVC来提供动态HTML内容。Spring MVC支持各种模板技术,包括Thymeleaf,FreeMarker和JSP。此外,许多其他模板引擎包括他们自己的Spring MVC集成。
Spring Boot包含对以下模板引擎的自动配置支持:
FreeMarker
Groovy
Thymeleaf
Mustache
[注]
如果可能,应该避免使用JSP。将它们与嵌入式servlet容器一起使用时有几个 已知的限制。
当您使用其中一个模板引擎和默认配置时,您的模板将自动从中获取src/main/resources/templates。
[注]
根据您运行应用程序的方式,IntelliJ IDEA以不同方式对类路径进行排序。从主方法在IDE中运行应用程序会产生与使用Maven或Gradle或其打包的jar运行应用程序时不同的顺序。这可能导致Spring Boot无法在类路径中找到模板。如果遇到此问题,可以在IDE中重新排序类路径,以便首先放置模块的类和资源。或者,您可以配置模板前缀以搜索templates类路径上的每个目录,如下所示: classpath*:/templates/。
28.1.11错误处理
默认情况下,Spring Boot提供了一个/error以合理方式处理所有错误的映射,并将其注册为servlet容器中的“全局”错误页面。对于计算机客户端,它会生成一个JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,有一个“whitelabel”错误视图,以HTML格式呈现相同的数据(以自定义它,添加View解析后的数据error)。要完全替换默认行为,您可以实现 ErrorController并注册该类型的bean定义,或者添加类型的bean ErrorAttributes以使用现有机制但替换内容。
[注]
在BasicErrorController可以用作自定义基类 ErrorController。如果要为新内容类型添加处理程序(默认情况下是text/html专门处理并为其他所有内容提供后备),这将特别有用。为此,请扩展BasicErrorController,添加@RequestMapping具有produces属性的公共方法 ,并创建新类型的bean。
您还可以定义一个带注释的类,@ControllerAdvice以自定义JSON文档以返回特定控制器和/或异常类型,如以下示例所示:
@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {
@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity> handleControllerException(HttpServletRequest request, Throwable ex) {
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);
}
}
在前面的示例中,如果YourException由同一包中定义的控制器抛出,则使用POJO AcmeController的JSON表示CustomErrorType而不是ErrorAttributes表示。
自定义错误页面
如果要显示给定状态代码的自定义HTML错误页面,可以将文件添加到文件/error夹。错误页面可以是静态HTML(即,添加到任何静态资源文件夹下),也可以使用模板构建。文件名应该是确切的状态代码或系列掩码。
例如,要映射404到静态HTML文件,您的文件夹结构如下所示:
src/
+- main/
+- java/
| +
+- resources/
+- public/
+- error/
| +- 404.html
+-
要5xx使用FreeMarker模板映射所有错误,您的文件夹结构如下:
src/
+- main/
+- java/
| +
+- resources/
+- templates/
+- error/
| +- 5xx.ftl
+-
对于更复杂的映射,您还可以添加实现该ErrorViewResolver 接口的bean ,如以下示例所示:
public class MyErrorViewResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request,
HttpStatus status, Map model) {
// 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也可以工作 DispatcherServlet。
@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"));
}
}
[注]
如果您注册的ErrorPage路径最终由a处理Filter (与一些非Spring Web框架(如Jersey和Wicket)一样),那么 Filter必须将其显式注册为ERROR调度程序,如以下示例所示:
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;
}
请注意,默认值FilterRegistrationBean不包括ERROR调度程序类型。
小心:当部署到servlet容器时,Spring Boot使用其错误页面过滤器将具有错误状态的请求转发到相应的错误页面。如果尚未提交响应,则只能将请求转发到正确的错误页面。缺省情况下,WebSphere Application Server 8.0及更高版本在成功完成servlet的服务方法后提交响应。您应该通过设置com.ibm.ws.webcontainer.invokeFlushAfterService为禁用此行为 false。
28.1.12spring HATEOAS
如果您开发使用超媒体的RESTful API,Spring Boot为Spring HATEOAS提供自动配置,适用于大多数应用程序。自动配置取代了使用@EnableHypermediaSupport和注册多个bean 的需要,以便于构建基于超媒体的应用程序,包括 LinkDiscoverers(用于客户端支持)和ObjectMapper配置为正确地将响应编组到所需表示中。的ObjectMapper是通过设置各种定制的spring.jackson.*属性,或者,如果存在的话,通过一个 Jackson2ObjectMapperBuilder豆。
您可以使用控制Spring HATEOAS的配置 @EnableHypermediaSupport。请注意,这样做会禁用ObjectMapper前面描述的自定义。
28.1.13 CORS支持
跨源资源共享 (CORS)是大多数浏览器实现 的W3C规范,允许您以灵活的方式指定授权何种跨域请求,而不是使用一些安全性较低且功能较弱的方法,如IFRAME或JSONP。
从版本4.2开始,Spring MVC 支持CORS。 在Spring Boot应用程序中使用带有 注释的控制器方法CORS配置@CrossOrigin不需要任何特定配置。 可以通过使用自定义方法注册bean 来定义全局CORS配置,如以下示例所示:WebMvcConfigureraddCorsMappings(CorsRegistry)
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer(){
return new WebMvcConfigurer(){
@
Override public void addCorsMappings(CorsRegistry registry){
registry.addMapping(“/ api / **”);
}
};
}
}
28.2“Spring WebFlux框架”
Spring WebFlux是Spring Framework 5.0中引入的新的反应式Web框架。与Spring MVC不同,它不需要Servlet API,完全异步且无阻塞,并 通过Reactor项目实现Reactive Streams规范。
Spring WebFlux有两种版本:基于功能和注释。基于注释的注释非常接近Spring MVC模型,如以下示例所示:
@RestController
@RequestMapping("/users")
public class MyRestController {
@GetMapping("/{user}")
public Mono getUser(@PathVariable Long user) {
// ...
}
@GetMapping("/{user}/customers")
public Flux getUserCustomers(@PathVariable Long user) {
// ...
}
@DeleteMapping("/{user}")
public Mono deleteUser(@PathVariable Long user) {
// ...
}
}
“WebFlux.fn”是功能变体,它将路由配置与请求的实际处理分开,如以下示例所示:
@Configuration
public class RoutingConfiguration {
@Bean
public RouterFunction monoRouterFunction(UserHandler userHandler) {
return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)
.andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)
.andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);
}
}
@Component
public class UserHandler {
public Mono getUser(ServerRequest request) {
// ...
}
public Mono getUserCustomers(ServerRequest request) {
// ...
}
public Mono deleteUser(ServerRequest request) {
// ...
}
}
WebFlux是Spring Framework的一部分,详细信息可在其 参考文档中找到。
[注]
您可以根据需要定义任意数量的RouterFunctionbean来模块化路由器的定义。如果需要应用优先级,可以订购Bean。
要开始,请将spring-boot-starter-webflux模块添加到您的应用程序中。
[注]
在应用程序中添加两个spring-boot-starter-web和spring-boot-starter-webflux模块会导致Spring Boot自动配置Spring MVC,而不是WebFlux。选择此行为是因为许多Spring开发人员spring-boot-starter-webflux 在其Spring MVC应用程序中添加了使用被动的WebClient。您仍然可以通过将所选应用程序类型设置为来强制执行您的选择 SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)。
28.2.1 Spring WebFlux自动配置
Spring Boot为Spring WebFlux提供自动配置,适用于大多数应用程序。
自动配置在Spring的默认值之上添加了以下功能:
为for HttpMessageReader和HttpMessageWriter实例配置编解码器( 本文档稍后将介绍)。
支持提供静态资源,包括对WebJars的支持( 本文档后面将介绍)。
如果你想保留Spring Boot WebFlux功能,并且想要添加额外的 WebFlux配置,你可以添加自己的 @Configuration类类WebFluxConfigurer但不需要 @EnableWebFlux。
如果要完全控制Spring WebFlux,可以添加自己的 @Configuration注释@EnableWebFlux。
28.2.2带有HttpMessageReaders和HttpMessageWriters的HTTP编解码器
Spring WebFlux使用HttpMessageReader和HttpMessageWriter接口来转换HTTP请求和响应。CodecConfigurer通过查看类路径中可用的库,它们被配置为具有合理的默认值。
Spring Boot通过使用CodecCustomizer实例进一步自定义。例如,spring.jackson.*配置密钥应用于Jackson编解码器。
如果需要添加或自定义编解码器,可以创建自定义CodecCustomizer 组件,如以下示例所示:
import org.springframework.boot.web.codec.CodecCustomizer;
@Configuration
public class MyConfiguration {
@Bean
public CodecCustomizer myCodecCustomizer(){
return codecConfigurer - > {
// ...
}
}
}
您还可以利用Boot的自定义JSON序列化程序和反序列化程序。
28.2.3静态内容
默认情况下,Spring Boot从类路径中名为/static( /public或/resources或/META-INF/resources)的目录中提供静态内容。它使用 ResourceWebHandlerSpring WebFlux,以便您可以通过添加自己WebFluxConfigurer的addResourceHandlers方法来修改该行为并覆盖该方法。
默认情况下,会映射资源/**,但您可以通过设置spring.webflux.static-path-pattern属性来调整它 。例如,/resources/**可以按如下方式重新定位所有资源 :
spring.webflux.static-path-pattern = / resources / **
您还可以使用自定义静态资源位置 spring.resources.static-locations。这样做会将默认值替换为目录位置列表。如果这样做,默认的欢迎页面检测会切换到您的自定义位置。因此,如果index.html您的任何位置在启动时存在,则它是应用程序的主页。
除了前面列出的“标准”静态资源位置之外,还为Webjars内容制作了一个特例。具有路径的任何资源 /webjars/**都是从jar文件提供的,如果它们以Webjars格式打包的话。
[注]
Spring WebFlux应用程序并不严格依赖于Servlet API,因此它们不能作为war文件部署,也不能使用该src/main/webapp目录。
28.2.4模板引擎
除REST Web服务外,您还可以使用Spring WebFlux来提供动态HTML内容。Spring WebFlux支持各种模板技术,包括Thymeleaf,FreeMarker和Mustache。
Spring Boot包含对以下模板引擎的自动配置支持:
FreeMarker
Thymeleaf
胡子
当您使用其中一个模板引擎和默认配置时,您的模板将自动从中获取src/main/resources/templates。
28.2.5错误处理
Spring Boot提供了WebExceptionHandler一种以合理的方式处理所有错误的方法。它在处理顺序中的位置紧接在WebFlux提供的处理程序之前,这被认为是最后的。对于计算机客户端,它会生成一个JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,有一个“whitelabel”错误处理程序,它以HTML格式呈现相同的数据。您还可以提供自己的HTML模板来显示错误(请参阅 下一节)。
自定义此功能的第一步通常涉及使用现有机制,但替换或扩充错误内容。为此,您可以添加类型的bean ErrorAttributes。
要更改错误处理行为,可以实现ErrorWebExceptionHandler并注册该类型的bean定义。由于a WebExceptionHandler是一个非常低级别的,Spring Boot还提供了一个方便AbstractErrorWebExceptionHandler的让你以WebFlux功能方式处理错误,如下例所示:
public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {
// Define constructor here
@Override
protected RouterFunction getRoutingFunction(ErrorAttributes errorAttributes) {
return RouterFunctions
.route(aPredicate, aHandler)
.andRoute(anotherPredicate, anotherHandler);
}
}
要获得更完整的图片,您还可以DefaultErrorWebExceptionHandler 直接子类化并覆盖特定方法。
自定义错误页面
如果要显示给定状态代码的自定义HTML错误页面,可以将文件添加到文件/error夹。错误页面可以是静态HTML(即,添加到任何静态资源文件夹下)或使用模板构建。文件名应该是确切的状态代码或系列掩码。
例如,要映射404到静态HTML文件,您的文件夹结构如下所示:
src/
+- main/
+- java/
| +
+- resources/
+- public/
+- error/
| +- 404.html
+-
要5xx使用Mustache模板映射所有错误,您的文件夹结构如下:
src/
+- main/
+- java/
| +
+- resources/
+- templates/
+- error/
| +- 5xx.mustache
+-
28.2.6 Web过滤器
Spring WebFlux提供了一个WebFilter可以实现过滤HTTP请求 - 响应交换的接口。WebFilter在应用程序上下文中找到的bean将自动用于过滤每个交换。
如果过滤器的顺序很重要,则可以实现Ordered或注释@Order。Spring Boot自动配置可以为您配置Web过滤器。执行此操作时,将使用下表中显示的订单:
Web Filter | Order |
---|---|
|
|
|
|
|
|