配置
## 1
切换配置环境:
spring.config.name指定环境属性来切换到另一个application.properties使用配置文件名。
spring.config.location环境属性(目录位置或文件路径的逗号分隔列表)引用显式位置。
$ java -jar myproject.jar --spring.config.name = myproject
或者
$ java -jar myproject.jar --spring.config.location = classpath:/default.properties,classpath:/override.properties
## 2
默认搜索路径从最低优先级到最高优先级(file:config/获胜)排序:
classpath:,classpath:/config,file:,file:config/
## 3
要把配置在类中使用,需要使用@ConfigurationProperties注解,比如
@ConfigurationProperties(prefix="my")
public class Config {
private List
public List
return this.servers;
}
}
## 4
YAML的缺点是无法通过@PropertySource注释加载YAML文件。因此,如果您需要以这种方式加载值,则需要使用属性文件。
## 5
第三方配置
除了@ConfigurationProperties用于注释类之外,您还可以在公共@Bean方法上使用它。当您想将属性绑定到控件之外的第三方组件时,此功能特别有用。
要从Environment属性配置Bean ,请添加@ConfigurationProperties到其Bean注册中:
@ConfigurationProperties(prefix =“ foo”)
@Bean
public FooComponent fooComponent(){
...
}
用foo前缀定义的任何属性都将以FooComponent与ConnectionProperties上面的示例类似的方式映射到该bean 。
Spring Boot使用一些宽松的规则将Environment属性绑定到 @ConfigurationPropertiesBean,因此Environment属性名称和Bean属性名称之间不需要完全匹配。
有用的常见示例包括虚线分隔的(例如,context-path绑定到contextPath)和大写的(例如,PORT绑定到port)环境属性。
person.firstName 标准驼峰式语法。
person.first-name 虚线符号,建议在.properties和.yml文件中使用。
person.first_name 下划线表示法,用于.properties和.yml文件中的替代格式。
PERSON_FIRST_NAME 大写格式。在使用系统环境变量时推荐使用。
## 6
spring.profiles.include属性可用于无条件添加活动配置文件。
spring.profiles.active 选择 替换
spring.profiles.include 引入 增加
例如,当使用开关运行具有以下属性的应用程序时 --spring.profiles.active=prod,proddb和prodmq配置文件也将被激活:
my.property:fromyamlfile spring.profiles:PROD spring.profiles.include:PRODDB,prodmq
以编程方式设置配置文件
在应用程序运行之前通过调用SpringApplication.setAdditionalProfiles(…)来以编程方式设置活动配置文件 。
也可以使用Spring的ConfigurableEnvironment界面激活配置文件。
日志
Spring Boot使用Commons Logging进行所有内部日志记录,但是使底层日志实现保持打开状态。提供了Java Util Logging, Log4J2和Logback的默认配置 。在每种情况下,记录器都已预先配置为使用控制台输出,同时还提供可选文件输出。
默认情况下,如果您使用“启动器”,则将使用Logback进行日志记录。还包括适当的Logback路由,以确保使用Java Util日志记录,Commons Logging,Log4J或SLF4J的从属库都能正常工作。
有许多可用于Java的日志记录框架。如果上面的列表看起来令人困惑,请不要担心。通常,您不需要更改日志记录依赖项,并且Spring Boot的默认设置也可以正常工作。
日志格式
Spring Boot的默认日志输出如下所示:
2014-03-05 10:57:51.112 INFO 45469 --- [main] org.apache.catalina.core.StandardEngine:启动Servlet引擎:Apache Tomcat / 7.0.52
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] oaccC [Tomcat]。[localhost]。[/]:初始化Spring嵌入式WebApplicationContext
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] osweb .context.ContextLoader:根WebApplicationContext:初始化于1358毫秒完成
2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] osbceServletRegistrationBean:映射servlet:'dispatcherServlet'到[/]
2014-03 -05 10:57:51.702 INFO 45469 --- [ost-startStop-1] osbcembedded.FilterRegistrationBean:将过滤器:“ hiddenHttpMethodFilter”映射到:[/ *]
输出以下项目:
日期和时间-毫秒精度,可轻松排序。
日志级别- , ERROR,,或。WARNINFODEBUGTRACE
进程ID。
一个---分离器来区分实际日志消息的开始。
线程名-括在方括号中(对于控制台输出,可能会被截断)。
记录器名称-这通常是源类名称(通常缩写)。
日志消息。
控制台输出
默认日志配置将在编写消息时将消息回显到控制台。默认情况下ERROR,WARN和INFO级别的消息被记录。您还可以通过使用--debug标志启动应用程序来启用“调试”模式。
$ java -jar myapp.jar --debug
也可以在application.properties中指定debug=true。
也可以通过使用--trace标志(或trace=true在中application.properties)启动应用程序来启用“跟踪”模式 。这将启用跟踪日志记录,以供选择一些核心记录器(嵌入式容器,Hibernate模式生成和整个Spring产品组合)。
颜色编码的输出
如果您的终端支持ANSI,则将使用彩色输出来提高可读性。您可以设置 spring.output.ansi.enabled为 支持的值以覆盖自动检测。
使用%clr转换字配置颜色编码。转换器将以最简单的形式根据对数级别为输出着色,例如:
%clr(%5p)
日志级别到颜色的映射如下:
FATAL 红色的
ERROR 红色的
WARN 黄色的
INFO 绿色的
DEBUG 绿色的
TRACE 绿色的
或者,您可以通过将其提供为转换的选项来指定应使用的颜色或样式。例如,将文本设置为黄色:
%clr(%d {yyyy-MM-dd HH:mm:ss.SSS}){黄色}
支持以下颜色和样式:
blue
cyan
faint
green
magenta
red
yellow
文件输出
默认情况下,Spring Boot将仅登录到控制台,并且不会写入日志文件。如果除了控制台输出外还想写日志文件,则需要设置一个 logging.file或logging.path属性(例如在中application.properties)。
下表显示了如何logging.*一起使用这些属性:
logging.file和logging.path都没配置则仅控制台记录。
logging.file有叫my.log和logging.path没配置则写入指定的日志文件。
logging.file没配置和logging.path配置为/var/log则写入spring.log指定的目录。
名称可以是确切的位置,也可以是相对于当前目录的位置。
日志文件达到10 Mb时将旋转,并且与控制台输出一样ERROR,WARN 并且INFO默认记录级别消息。
日志级别
所有受支持的日志记录系统都可以使用'logging.level.* = LEVEL'在Spring中设置记录器级别 Environment(例如在中application.properties),其中'LEVEL'是TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF之一。该root记录器可以通过以下方式配置logging.level.root。
application.properties:
logging.level.root = WARN
logging.level.org.springframework.web = DEBUG
logging.level.org.hibernate = ERROR
自定义日志配置
可以通过在类路径中包含适当的库来激活各种日志记录系统,并通过在类路径的根目录中或在SpringEnvironment属性 指定的位置中提供适当的配置文件来进一步自定义各种日志记录系统logging.config。
您可以使用org.springframework.boot.logging.LoggingSystemsystem属性强制Spring Boot使用特定的日志记录系统 。该值应该是实现的完全限定的类名LoggingSystem。您还可以通过使用值完全禁用Spring Boot的日志记录配置none。
由于日志记录是在ApplicationContext创建之前初始化的,因此无法从@PropertySourcesSpring@Configuration文件中控制日志记录。系统属性和常规的Spring Boot外部配置文件都可以正常工作。
根据您的日志记录系统,将加载以下文件:
logback logback-spring.xml,logback-spring.groovy,logback.xml或者logback.groovy
Log4j2 log4j2-spring.xml 或者 log4j2.xml
JDK(Java实用程序日志记录) logging.properties
建议您将-spring变体用于日志记录配置(例如logback-spring.xml而不是logback.xml)。如果使用标准配置位置,Spring将无法完全控制日志初始化。
从“可执行jar”运行时,Java Util Logging存在一些已知的类加载问题,这些问题会导致出现问题。我们建议您尽可能避免使用它。
如果要在日志记录属性中使用占位符,则应使用 Spring Boot的语法而不是基础框架的语法。值得注意的是,如果您使用的是Logback,则应将其 :用作属性名称与其默认值之间的分隔符,而不是 :-。
您可以通过仅覆盖LOG_LEVEL_PATTERN(或logging.pattern.level使用Logback)将MDC和其他临时内容添加到日志行。例如,如果使用,logging.pattern.level=user:%X{user} %5p则默认日志格式将包含“用户”的MDC条目(如果存在),例如
2015-09-30 12:30:04.031 user:juergen INFO 22174-[[nio-8080-exec-0] demo.Controller
处理身份验证的请求
Spring Boot包含许多Logback扩展,可以帮助进行高级配置。您可以在logback-spring.xml配置文件中使用这些扩展名。
使用logback-spring.xml或定义一个 logging.config属性,无法在标准logback.xml配置文件中使用扩展名,因为扩展名加载时间过早。。
SpringMVC
Spring MVC自动配置
Spring Boot为Spring MVC提供了自动配置,可与大多数应用程序一起很好地工作。
自动配置在Spring的默认值之上添加了以下功能:
包含ContentNegotiatingViewResolver和BeanNameViewResolver。
支持提供静态资源,包括对WebJars的支持(请参见下文)。
自动登记Converter,GenericConverter,Formatter豆类。
支持HttpMessageConverters(请参见下文)。
自动注册MessageCodesResolver(请参见下文)。
静态index.html支持。
定制Favicon支持。
自动使用ConfigurableWebBindingInitializerbean(请参见下文)。
如果您想保留Spring Boot MVC功能,而只想添加其他MVC配置(拦截器,格式化程序,视图控制器等),则可以添加自己@Configuration的type类 WebMvcConfigurerAdapter,但不添加 @EnableWebMvc。如果您希望提供的自定义实例RequestMappingHandlerMapping,RequestMappingHandlerAdapter或者 ExceptionHandlerExceptionResolver可以声明一个WebMvcRegistrationsAdapter 提供此类组件的实例。
如果要完全控制Spring MVC,可以使用添加自己的@Configuration 注释@EnableWebMvc。
HttpMessageConverters
Spring MVC使用该HttpMessageConverter接口来转换HTTP请求和响应。明智的默认设置是开箱即用的,例如,可以将对象自动转换为JSON(使用Jackson库)或XML(使用Jackson扩展名(如果可用),或者使用JAXB)转换为JSON。字符串UTF-8默认情况下使用编码。
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);
}
}
自定义JSON序列化器和反序列化器
如果您使用Jackson来序列化和反序列化JSON数据,则可能需要编写自己的JsonSerializer和JsonDeserializer类。自定义序列化程序通常是 通过Module向Jackson进行注册的,但是Spring Boot提供了一种可选的@JsonComponent注释,它使直接注册Spring Bean变得更加容易。
您可以@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
// ...
}
}
Spring Boot还提供了 JsonObjectSerializer和 JsonObjectDeserializer基类,它们在序列化对象时为标准的Jackson版本提供了有用的替代方法。
静态内容
默认情况下,Spring Boot将从类路径中名为/static(/public或/resources或/meta-INF/resources)的目录中或ServletContext 目录的根中提供静态内容。
它使用ResourceHttpRequestHandlerSpring MVC中的from,因此您可以通过添加自己WebMvcConfigurerAdapter的addResourceHandlers方法并覆盖该方法来修改该行为。
在独立的Web应用程序中,还启用了容器中的默认servlet,并将其用作后备,因为Spring始终能够通过处理请求DispatcherServlet。
使用spring.resources.staticLocations (使用目录位置列表替换默认值)来自定义静态资源位置。如果执行此操作,则默认的欢迎页面检测将切换到您的自定义位置,因此,如果index.html启动时您的任何位置都有 ,则它将成为应用程序的主页。
除了上面的“标准”静态资源位置以外,还对Webjars内容进行了特殊处理。如果/webjarsfavicon.ico)。
所有其他端点的HTTP基本安全性。
发布到Spring的安全事件ApplicationEventPublisher(成功和失败的身份验证和访问被拒绝)。
默认情况下,Spring Security提供的常见低级功能(HSTS,XSS,CSRF,缓存)处于启用状态。
可以使用外部属性(security.*)打开或关闭以上所有内容或对其进行修改。要在不更改任何其他自动配置功能的情况下覆盖访问规则,请添加带有@Bean类型的WebSecurityConfigurerAdapter, @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)然后对其进行配置以满足您的需求。
默认情况下,aWebSecurityConfigurerAdapter将匹配任何路径。如果您不想完全覆盖Spring Boot的自动配置访问规则,那么您的适配器必须显式配置您要覆盖的路径。
授权服务器
要创建授权服务器并授予访问令牌,您需要使用 @EnableAuthorizationServer并提供security.oauth2.client.client-id和 security.oauth2.client.client-secret]属性。客户端将在内存中为您注册。
完成后,您将能够使用客户端凭据来创建访问令牌,例如:
$ curl client:secret@localhost:8080/oauth/token -d grant_type=password -d username=user -d password=pwd
/token端点的基本身份验证凭据是client-id和 client-secret。用户凭证是正常的Spring Security用户详细信息(在Spring Boot中默认为“用户”和随机密码)。
要自行关闭自动配置并配置Authorization Server功能,只需添加@Beantype即可AuthorizationServerConfigurer。
自定义错误页面
如果要为给定状态代码显示自定义 HTML 错误页面,可以将文件添加到/error目录。错误页面可以是静态 HTML(即添加到任何静态资源目录下),也可以是使用模板构建的。文件的名称应该是确切的状态代码或系列掩码。
例如,要映射404到静态 HTML 文件,您的目录结构将如下所示:
src/
+- main/
+- java/
| +
+- resources/
+- public/
+- error/
| +- 404.html
+-
要5xx使用 FreeMarker 模板映射所有错误,您的目录结构如下:
src/
+- main/
+- java/
| +
+- resources/
+- templates/
+- error/
| +- 5xx.ftlh
+-
对于更复杂的映射,您还可以添加实现该ErrorViewResolver接口的bean ,如以下示例所示:
public class MyErrorViewResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map
// Use the request or status to optionally return a ModelAndView
if (status == HttpStatus.INSUFFICIENT_STORAGE) {
// We could add custom model values here
new ModelAndView("myview");
}
return null;
}
}
还可以使用常规的Spring MVC特性,比如@ExceptionHandler方法和@ ControllerAdvice。然后,错误控制器拾取任何未处理的异常。
在 Spring MVC 之外映射错误页面
对于不使用 Spring MVC 的应用,可以使用ErrorPageRegistrar接口直接注册ErrorPages.
这种抽象直接与底层嵌入式 servlet 容器一起工作,即使您没有 Spring MVC DispatcherServlet也能工作。
@Configuration(proxyBeanMethods = false)
public class MyErrorPagesConfiguration {
@Bean
public ErrorPageRegistrar errorPageRegistrar() {
return this::registerErrorPages;
}
private void registerErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
}
}
正常关机
所有四个嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于 Servlet 的 Web 应用程序都支持正常关闭。它作为关闭应用程序上下文的一部分发生,并在停止SmartLifecyclebean的最早阶段执行。此停止处理使用超时,该超时提供宽限期,在此期间允许完成现有请求但不允许新请求。不允许新请求的确切方式因正在使用的 Web 服务器而异。Jetty、Reactor Netty 和 Tomcat 将停止接受网络层的请求。Undertow 将接受请求,但会立即以服务不可用 (503) 响应进行响应。
使用 Tomcat 正常关闭需要 Tomcat 9.0.33 或更高版本。
要启用正常关机,请配置该server.shutdown属性,如以下示例所示:
server.shutdown=graceful
要配置超时时间,请配置该spring.lifecycle.timeout-per-shutdown-phase属性,如以下示例所示:
spring.lifecycle.timeout-per-shutdown-phase=20s
开启shutdown endpoint
Spring Boot Actuator的shutdown endpoint默认是关闭的,因此在application.properties中开启shutdown endpoint:
#启用
shutdownendpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false
退出应用
申请退出
每个服务器都SpringApplication将向JVM注册一个关闭钩子,以确保ApplicationContext在退出时正常关闭该钩子 。
可以使用所有标准的Spring生命周期回调(例如DisposableBean接口或@PreDestroy批注)。
另外如果bean希望在应用程序结束时返回特定的退出代码,则可以实现org.springframework.boot.ExitCodeGenerator接口。
CORS 支持
跨域资源共享(CORS) 是大多数浏览器实现的W3C 规范,它允许您以灵活的方式指定授权的跨域请求类型,而不是使用一些不太安全且功能较弱的方法,例如 Iframe 或 JSONP .
从 version 4.2 开始,Spring MVC支持 CORS。在 Spring Boot 应用程序中使用带有注释的控制器方法 CORS 配置@CrossOrigin不需要任何特定配置。 可以通过使用自定义方法注册bean来定义全局 CORS 配置,如下例所示:WebMvcConfigureraddCorsMappings(CorsRegistry)
@Configuration(proxyBeanMethods = false)
public class MyCorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}



