SpringBoot官网学习翻译笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SpringBoot官网学习翻译笔记

配置

## 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<String> servers = new ArrayList<String>();

   public List<String> getServers() {

       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

image.gif

以编程方式设置配置文件

在应用程序运行之前通过调用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<SomeObject> {

       // ...

   }

   public static class Deserializer extends JsonDeserializer<SomeObject> {

       // ...

   }

}

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内容进行了特殊处理。如果/webjars/** 将所有带有路径的资源以Webjars格式打包,则将从jar文件提供这些资源。

如果您的应用程序将打包为jar,则不要使用src/main/webapp目录。

尽管此目录是一个通用标准,但它仅适用于war打包,如果生成jar,大多数构建工具都将默默地忽略该目录。

如果您使用的是JBoss,则需要声明webjars-locator-jboss-vfs 依赖关系而不是webjars-locator;。否则,所有Webjar都会解析为404。

要使用缓存清除,以下配置将为所有静态资源配置缓存清除解决方案,从而有效地在URL中添加内容哈希,例如 <link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>:

spring.resources.chain.strategy.content.enabled = true

spring.resources.chain.strategy.content.paths = / **

通过ResourceUrlEncodingFilter为Thymeleaf,Velocity和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"而其他资源仍将使用content <link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>。

ConfigurableWebBindingInitializer

Spring MVC使用aWebBindingInitializer来初始化WebDataBinder特定请求。如果创建自己的ConfigurableWebBindingInitializer @Bean,Spring Boot将自动配置Spring MVC以使用它。

模板引擎

除了REST Web服务之外,您还可以使用Spring MVC来提供动态HTML内容。Spring MVC支持多种模板技术,包括Velocity,FreeMarker和JSP。许多其他模板引擎还附带了自己的Spring MVC集成。

Spring Boot包括对以下模板引擎的自动配置支持:

FreeMarker

Groovy

Thymeleaf

Velocity (deprecated in 1.4)

Mustache

当您使用默认配置的这些模板引擎之一时,将从中自动提取模板src/main/resources/templates。

应避免使用JSP,将它们与嵌入式servlet容器一起使用时,存在下列已知的几个限制。

当运行一个使用嵌入式servlet容器的Spring Boot应用程序时(并打包为一个可执行的归档文件),JSP支持有一些限制。

在Tomcat中,如果您使用war打包,它应该可以工作,也就是说,一个可执行的war可以工作,并且可以部署到一个标准容器中(不限于,但包括Tomcat)。由于Tomcat中的硬编码文件模式,可执行jar将不起作用。

使用Jetty,如果您使用war打包,它应该可以工作,也就是说,一个可执行的war可以工作,并且可以部署到任何标准容器中。

暗流不支持JSP。

创建自定义error.jsp页面不会覆盖错误处理的默认视图,应该使用自定义错误页面。

有一个JSP示例,您可以看到如何设置。

IntelliJ IDEA根据运行应用程序的方式对类路径进行不同的排序。通过IDE的main方法在IDE中运行应用程序将导致与使用Maven或Gradle或从打包的jar运行应用程序时的顺序不同。这可能导致Spring Boot无法在类路径上找到模板。如果您受到此问题的影响,则可以在IDE中重新排序类路径,以首先放置模块的类和资源。或者,您可以配置模板前缀以搜索classpath上的每个模板目录classpath*:/templates/。

错误处理

/error默认情况下,Spring Boot提供了一个映射,该映射以明智的方式处理所有错误,并且已在servlet容器中注册为“全局”错误页面。对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,有一个“ whitelabel”错误视图,该视图以HTML格式呈现相同的数据(要对其进行自定义,只需添加一个View解析为“错误”的)。要完全替换默认行为,您可以实现 ErrorController并注册该类型的Bean定义,或者干脆添加一个类型的BeanErrorAttributes以使用现有机制但替换其内容。

在BasicErrorController可以用作自定义基类ErrorController。如果您要为新的内容类型添加处理程序(默认是text/html专门处理并为其他所有内容提供后备功能),则此功能特别有用。要做到这一点,只需扩展BasicErrorController并添加@RequestMapping具有produces属性的公用方法 ,然后创建您的新类型的Bean。

还可以定义一个@ControllerAdvice自定义JSON文档以针对特定的控制器和/或异常类型返回。

@ControllerAdvice(basePackageClasses = FooController.class)

public class FooControllerAdvice 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由与包在同一包中定义的控制器抛出,则将使用POJOFooController的json表示CustomerErrorType代替该ErrorAttributes表示。

自定义错误页面

如果要显示给定状态代码的自定义HTML错误页面,则将文件添加到文件/error夹。错误页面可以是静态HTML(即添加到任何静态资源文件夹下),也可以使用模板构建。文件名应为确切的状态代码或系列掩码。

例如,要映射404到静态HTML文件,您的文件夹结构应如下所示:

src/

+- main/

    +- java/

    |   + <source code>

    +- resources/

        +- public/

            +- error/

            |   +- 404.html

            +- <other public assets>

要5xx使用FreeMarker模板映射所有错误,您将具有以下结构:

src/

+- main/

    +- java/

    |   + <source code>

    +- resources/

        +- templates/

            +- error/

            |   +- 5xx.ftl

            +- <other templates>

对于更复杂的映射,您还可以添加实现该ErrorViewResolver 接口的bean 。

public class MyErrorViewResolver implements ErrorViewResolver {

   @Override

   public ModelAndView resolveErrorView(HttpServletRequest request,

           HttpStatus status, Map<String, Object> 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;

}

WebSphere Application Server上的错误处理

当部署到servlet容器时,Spring Boot使用其错误页面过滤器将具有错误状态的请求转发到适当的错误页面。如果尚未提交响应,则只能将请求转发到正确的错误页面。缺省情况下,WebSphere Application Server 8.0及更高版本在成功完成servlet的服务方法后提交响应。您应该通过设置com.ibm.ws.webcontainer.invokeFlushAfterService为禁用此行为 false

Spring HATEOAS

如果您正在开发利用超媒体的RESTful API,Spring Boot会为Spring HATEOAS提供自动配置,该配置可与大多数应用程序很好地配合使用。自动配置取代了使用@EnableHypermediaSupport和注册大量Bean的需求,以简化构建基于超媒体的应用程序的过程,包括 LinkDiscoverers(用于客户端支持)和ObjectMapper配置为将响应正确地编组为所需表示形式的应用程序。在ObjectMapper将根据定制spring.jackson.*的属性或者Jackson2ObjectMapperBuilder如果存在豆。

您可以使用来控制Spring HATEOAS的配置 @EnableHypermediaSupport。请注意,这将禁用上述ObjectMapper自定义。

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 WebMvcConfigurerAdapter() {

           @Override

           public void addCorsMappings(CorsRegistry registry) {

               registry.addMapping("/api/**");

           }

       };

   }

}

嵌入式Servlet容器支持

Spring Boot包括对嵌入式Tomcat,Jetty和Undertow服务器的支持。大多数开发人员将仅使用适当的“启动器”来获取完全配置的实例。默认情况下,嵌入式服务器将在port上侦听HTTP请求8080。

Servlet,过滤器和侦听器

使用嵌入式Servlet容器时,您可以HttpSessionListener使用Spring Bean或扫描Servlet组件来注册Servlet规范(例如)中的Servlet,过滤器和所有侦听器。

将Servlet,过滤器和侦听器注册为Spring Bean

任何Servlet,Filter或者Servlet*Listener实例,它是一个Spring bean将与嵌入容器注册。如果要application.properties在配置过程中引用一个值,这将特别方便。

默认情况下,如果上下文仅包含一个Servlet,它将被映射到/。对于多个Servlet Bean,该Bean名称将用作路径前缀。过滤器将映射到/*。

Servlet上下文初始化

嵌入式Servlet容器将不会直接执行Servlet 3.0+ javax.servlet.ServletContainerInitializer接口或Spring的 org.springframework.web.WebApplicationInitializer接口。这是一个有意设计的决定,旨在降低旨在在war中运行的第3方库破坏Spring Boot应用程序的风险。

如果您需要在Spring Boot应用程序中执行servlet上下文初始化,则应该注册一个实现该org.springframework.boot.context.embedded.ServletContextInitializer接口的bean 。单个onStartup方法提供对的访问ServletContext,并且可以根据需要轻松地用作现有适配器WebApplicationInitializer。

扫描Servlet,过滤器和侦听器

当使用嵌入式容器,自动注册@WebServlet,@WebFilter和@WebListener注解的类可以使用启用@ServletComponentScan。

@ServletComponentScan 在独立容器中将无效,在该容器中将使用容器的内置发现机制。

自定义嵌入式servlet容器

可以使用SpringEnvironment 属性来配置常见的servlet容器设置。通常,您将在application.properties 文件中定义属性。

常用服务器设置包括:

网络设置:监听传入HTTP请求的端口(server.port),绑定到的接口地址server.address,等等。

会话设置:会话是否为持久(server.session.persistence),会话超时(server.session.timeout),会话数据位置(server.session.store-dir)和会话Cookie配置(server.session.cookie.*)。

错误管理:错误页面的位置(server.error.path)等。

SSL协议

HTTP压缩

如果您需要以编程方式配置嵌入式servlet容器,则可以注册一个实现该EmbeddedServletContainerCustomizer接口的Spring bean 。 EmbeddedServletContainerCustomizer提供对的访问, ConfigurableEmbeddedServletContainer其中包括许多自定义设置方法。

import org.springframework.boot.context.embedded.*;

import org.springframework.stereotype.Component;

@Component

public class CustomizationBean implements EmbeddedServletContainerCustomizer {

   @Override

   public void customize(ConfigurableEmbeddedServletContainer container) {

       container.setPort(9000);

   }

}

直接自定义ConfigurableEmbeddedServletContainer

如果上面的自定义方法太有限,你可以注册 TomcatEmbeddedServletContainerFactory,JettyEmbeddedServletContainerFactory或 UndertowEmbeddedServletContainerFactory bean 。

@Bean

public EmbeddedServletContainerFactory servletContainer() {

   TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();

   factory.setPort(9000);

   factory.setSessionTimeout(10, TimeUnit.MINUTES);

   factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));

   return factory;

}

安全性

如果Spring Security在类路径中,则默认情况下,Web应用程序将在所有HTTP端点上使用“基本”身份验证来确保安全。要将方法级别的安全性添加到Web应用程序中,您还可以添加@EnableGlobalMethodSecurity所需的设置。可以在Spring Security Reference中找到更多信息。

默认值AuthenticationManager只有一个用户(“用户”用户名和随机密码,在应用程序启动时以INFO级别打印)

使用默认的安全密码:78fa095d-3f4c-48b1-ad50-e24c31d5cf35

如果您微调日志记录配置,请确保将 org.springframework.boot.autoconfigure.security类别设置为日志INFO消息,否则将不会打印默认密码。

可以通过提供密码来更改密码security.user.password。

默认安全配置在SecurityAutoConfiguration从那里导入的类中以及在从中导入的类中实现(SpringBootWebSecurityConfiguration用于Web安全和AuthenticationManagerConfiguration身份验证配置,这在非Web应用程序中也很重要)。要完全关闭默认的Web应用程序安全性配置,您可以添加一个Bean @EnableWebSecurity(这不会禁用身份验证管理器配置或Actuator的安全性)。要自定义它,通常使用外部属性和类型的Bean WebSecurityConfigurerAdapter (例如,添加基于表单的登录名)。要也关闭身份验证管理器配置,您可以添加类型的Bean AuthenticationManager,或者AuthenticationManager通过AuthenticationManagerBuilder在@Configuration类中的一个方法中自动将an进行接线来配置全局。在其中有几个安全的应用程序Spring Boot示例可帮助您开始使用常见的用例。

在Web应用程序中开箱即用的基本功能是:

AuthenticationManager具有内存存储和单个用户的Bean(SecurityProperties.User有关用户的属性,请参阅 )。

常见的静态资源位置忽略(不安全的)路径(/css/**,/js/**, /images/**,/webjars/**和**/favicon.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/

    |   + <source code>

    +- resources/

        +- public/

            +- error/

            |   +- 404.html

            +- <other public assets>

要5xx使用 FreeMarker 模板映射所有错误,您的目录结构如下:

src/

+- main/

    +- java/

    |   + <source code>

    +- resources/

        +- templates/

            +- error/

            |   +- 5xx.ftlh

            +- <other templates>

对于更复杂的映射,您还可以添加实现该ErrorViewResolver接口的bean ,如以下示例所示:

public class MyErrorViewResolver implements ErrorViewResolver {

   @Override

   public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {

       // 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/**");

           }

       };

   }

}

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
18天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
41 9
|
2月前
|
SQL NoSQL Java
springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
本文介绍了如何在Spring Boot中操作NoSQL数据库MongoDB,包括在MongoDB官网创建服务器、配置Spring Boot项目、创建实体类、仓库类、服务类和控制器类,以及如何进行测试。
20 1
springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
36 9
|
2月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
21 1
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
68 2
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
112 1
|
2月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
27 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
2月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
98 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
29 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
下一篇
无影云桌面