本文档将帮助您把应用程序迁移到 Spring Boot 2.0。html
首先,Spring Boot 2.0须要Java 8或更高版本。Java 6 和 7 再也不受支持。java
在 Spring Boot 2.0 中,许多配置属性被从新命名/删除,开发人员须要更新application.properties
/ application.yml
相应的配置。为了帮助你,Spring Boot 发布了一个新spring-boot-properties-migrator
模块。一旦做为依赖添加到项目中,这不只将分析应用程序的环境并在启动时打印诊断信息,并且还会在运行时为您暂时迁移属性。这是您的应用程序迁移期间必须具有的条件:node
1<dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring-boot-properties-migrator</artifactId>
4</dependency>复制代码
注意:完成迁移后,请确保从项目的依赖关系中删除此模块。git
现在暴露为属性的插件配置属性都以一个spring-boot
前缀开始,以保持一致性并避免与其余插件发生冲突。github
例如,如下命令prod
使用命令行启用配置文件web
1mvn spring-boot:run -Dspring-boot.run.profiles=prod复制代码
自定义包含/排除模式已与最新的 Surefire 默认设置保持一致。若是您依赖咱们的,请相应地更新您的插件配置。他们曾经以下:redis
1<plugin>
2 <groupId>org.apache.maven.plugins</groupId>
3 <artifactId>maven-surefire-plugin</artifactId>
4 <configuration>
5 <includes>
6 <include>**/*Tests.java</include>
7 <include>**/*Test.java</include>
8 </includes>
9 <excludes>
10 <exclude>**/Abstract*.java</exclude>
11 </excludes>
12 </configuration>
13</plugin>复制代码
PS: 若是您使用 JUnit 5,则应将 Surefire 降级到 2.19.1
。该**/*Tests.java
版本不包含此模式,所以若是您依赖该模式,请确保将其添加到您的配置中。算法
Spring Boot 的 Gradle 插件在很大程度上已被重写,以实现许多重大改进。您能够在其参考文献和API文档中阅读关于插件功能的更多信息。spring
Spring Boot 的 Gradle 插件再也不自动应用依赖管理插件。相反,Spring Boot 的插件如今能够经过导入正确版本的spring-boot-dependencies BOM 来应用依赖管理插件。这使您能够更好地控制配置依赖性管理的方式和时间。sql
对于大多数使用依赖管理插件的应用程序来讲就足够了:
1apply plugin: 'org.springframework.boot'
2apply plugin: 'io.spring.dependency-management' // <-- add this to your build.gradle复制代码
注意:依赖管理插件仍然是 spring-boot-gradle-plugin 的传递依赖项,因此不须要在 buildscript 配置中将其列为类路径依赖项。
该bootRepackage
任务已被替换bootJar
,并bootWar
分别创建可执行的 Jars 和 Wars 的任务。jar
和war
任务再也不参与。
BootRun
,BootJar
和BootWar
任务如今都使用mainClassName
的属性来配置主类的名称。这使得三个特定于引导的任务相互一致,并将其与 Gradle 本身的应用程序插件进行对齐。
Spring Boot 默认使用 CGLIB 代理,包括 AOP 支持。若是你须要基于代理的代理,你须要设置spring.aop.proxy-target-class
为false
。
Spring Boot 应用程序如今能够在更多模式下运行,所以spring.main.web-environment
如今不推荐使用属性来支持spring.main.web-application-type
更多的控制。
若是您想确保应用程序不启动 Web 服务器,则必须将该属性更改成:
1spring.main.web-application-type=none复制代码
注意:还有一个setWebApplicationType
上SpringApplication
,若是你想这样作编程。
咱们已经添加了一个新事件ApplicationStartedEvent
。 ApplicationStartedEvent
在上下文刷新以后但在任何应用程序和命令行参数被调用以前发送。 ApplicationReadyEvent
在任何应用程序和命令行参数被调用后发送。它表示应用程序已准备好为请求提供服务。
请参阅更新的参考文档。
在咱们限制 Spring Boot 使用的根名称空间的数量的过程当中,与标志相关的属性已被重定位到spring.banner
。
有关宽松绑定的规则已经收紧。咱们假设一个现有的acme.my-project.my-name
属性:
acme.myProject
或acme.my_project
无效 - 您必须acme.my-project
在此处使用。 my-name
),camel-case(myName
)或 snake-case(my_name
)。 ACME_MYPROJECT_MYNAME
。 这种新的放松绑定具备如下几个优势:
@ConditionalOnProperty
:只要密钥是以规范格式定义的,支持的松散变体就能够透明地工做。若是您正在使用该prefix
属性,则如今只需使用name
或value
属性便可放置完整密钥。 RelaxedPropertyResolver
再也不能够Environment
自动处理:env.getProperty("com.foo.my-bar")
将找到一个com.foo.myBar
属性。 该org.springframework.boot.bind
软件包再也不可用,并被新的宽松绑定规则所取代。特别是,RelaxedDataBinder
朋友已被新的Binder
API 取代。如下样品MyProperties
从app.acme
前缀中进行绑定。
1MyProperties target = Binder.get(environment)
2 .bind("app.acme", MyProperties.class)
3 .orElse(null);复制代码
因为如今内置了轻松绑定,所以只要使用其中一种支持的格式,就能够请求任何属性而没必要关心案例:
1FlagType flagType = Binder.get(environment)
2 .bind("acme.app.my-flag", FlagType.class)
3 .orElse(FlagType.DEFAULT);复制代码
@ConfigurationProperties
验证若是您想打开验证,如今必须为您的@ConfigurationProperties
对象添加注释@Validated
。
spring.config.location
配置的行为已被修复; 它先前将一个位置添加到默认位置列表中,如今它将替换默认位置。若是你依靠以前处理的方式,如今应该使用它spring.config.additional-location
。
为了支持反应性用例,嵌入式容器包结构已经被很是普遍地重构。 EmbeddedServletContainer
已被从新命名为,WebServer
而且该org.springframework.boot.context.embedded
包已被从新定位到org.springframework.boot.web.embedded
。例如,若是您使用TomcatEmbeddedServletContainerFactory
回调接口定制嵌入式Tomcat容器,则应该使用TomcatServletWebServerFactory
。
许多server.*
属性 ( Servlet 特有的) 已经转移到server.servlet
:
旧的属性 |
新的属性 |
---|---|
server.context-parameters.* |
server.servlet.context-parameters.* |
server.context-path |
server.servlet.context-path |
server.jsp.class-name |
server.servlet.jsp.class-name |
server.jsp.init-parameters.* | server.servlet.jsp.init-parameters.* |
server.jsp.registered |
server.servlet.jsp.registered |
server.servlet-path |
server.servlet.path |
之前有几个 Spring Boot starter 是依赖于 Spring MVC 而传递的spring-boot-starter-web
。借助 Spring WebFlux的新支持spring-boot-starter-mustache
,spring-boot-starter-freemarker
并spring-boot-starter-thymeleaf
再也不依赖它。开发者有责任选择和添加spring-boot-starter-web
或spring-boot-starter-webflux
。
Mustache 模板的默认文件扩展名是.html
,它如今.mustache
与官方规范和大多数IDE插件一致。您能够经过更改spring.mustache.suffix
配置键来覆盖此新的默认值。
在 2.0 中,咱们改变了 Jackson 配置默认值,将 JSR-310 日期写为 ISO-8601 字符串。若是你想回到之前的行为,你能够添加spring.jackson.serialization.write-dates-as-timestamps=true
到你的配置。
新的spring-boot-starter-json
starter 收集必要的位以读取和写入 JSON。它不只提供了jackson-databind
,与Java8 工做时也是有用的模块:jackson-datatype-jdk8
,jackson-datatype-jsr310
和jackson-module-parameter-names
。之前您须要手动依赖这些模块,如今能够依靠这个新的 starter 。
咱们已决定在 Spring MVC 应用程序中更改后缀路径匹配的默认值(请参阅#11105)。按照 Spring Framework 中记录的最佳实践,此功能再也不默认启用。
若是您的应用程序但愿将请求"GET /projects/spring-boot.json"
映射到@GetMapping("/projects/spring-boot")
映射,则此更改会影响您。
有关此更多信息以及如何减轻此更改,请查阅Spring Boot中有关路径匹配和内容协商的参考文档。
Servlet 过滤器的默认调度程序类型如今是DipatcherType.REQUEST
; 这使 Spring Boot 的默认值与 Servlet 规范的默认值一致。若是您但愿将过滤器映射到其余调度程序类型,请使用FilterRegistrationBean
注册您的过滤器。
注意:Spring Security 和 Spring Session 过滤器配置 ASYNC
, ERROR
以及 REQUEST
调度类型。
该requestFactory(ClientHttpRequestFactory)
方法已被新requestFactory(Supplier
方法所取代。Supplier
容许构建器生成的每一个模板使用它本身的请求工厂,从而避免共享工厂可能致使的反作用。见#11255。
Spring Boot 1.x 使用并提供依赖关系管理org.webjars:webjars-locator
。webjars-locator
是一个“命名不佳的库……包装webjars-locator-core
项目”。org.webjars:webjars-locator
应该更新依赖项来org.webjars:webjars-locator-core
代替使用。
Spring Boot 2 极大地简化了默认的安全配置,并使添加定制安全变得简单。Spring Boot 如今具备一种行为,只要您添加本身的 WebSecurityConfigurerAdapter
就会退出,而不是进行多种与安全性相关的自动配置。
若是您使用如下任何属性,则会受到影响:
1security.basic.authorize-mode
2security.basic.enabled
3security.basic.path
4security.basic.realm
5security.enable-csrf
6security.headers.cache
7security.headers.content-security-policy
8security.headers.content-security-policy-mode
9security.headers.content-type
10security.headers.frame
11security.headers.hsts
12security.headers.xss
13security.ignored
14security.require-ssl
15security.sessions复制代码
安全自动配置再也不公开选项,并尽量使用 Spring Security 默认值。一个明显的反作用是使用 Spring Security 的内容协商进行受权(表单登陆)。
默认状况下,Spring Boot 使用生成的密码配置单个用户。用户可使用 spring.security.user.*
属性进行配置。要进一步定制用户或添加其余用户,您将不得不公开一个UserDetailsService
bean。
若是您想将 Spring Security AuthenticationManager
做为 bean 公开,请覆盖authenticationManagerBean
您的方法WebSecurityConfigurerAdapter
并为其添加注释@Bean
。
从功能的 Spring Security OAuth 项目 迁移到核心 Spring Security。再也不为依赖关系提供依赖管理,Spring Boot 2 经过 Spring Security 5 提供 OAuth 2.0 客户端支持。
若是您依赖还没有迁移的 Spring Security OAuth 功能,则须要在其余 jar 上添加依赖项,请查看文档以获取更多详细信息。咱们还继续支持 Spring Boot 1.5,以便旧版应用程序能够继续使用它,直到提供升级路径。
执行器再也不有单独的安全自动配置(management.security.*
属性消失)。sensitive
每一个端点的标志也没有在安全配置中变得更加明确。若是您依赖于此行为,则须要建立或调整您的安全配置,以保护您选择角色的端点。
例如,假设如下配置:
1endpoints.flyway.sensitive=false
2endpoints.info.sensitive=true
3management.security.roles=MY_ADMIN
1http
2 .authorizeRequests()
3 .requestMatchers(EndpointRequest.to("health", "flyway")).permitAll()
4 .requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("MY_ADMIN")
5 ...复制代码
须要注意的是在2.x
,health
和info
在默认状况下启用(与health
默认状况下不显示其细节)。为了与这些新的默认值一致,health
已被添加到第一个匹配器。
默认链接池已从 Tomcat 切换到 HikariCP。若是您过去spring.datasource.type
在基于 Tomcat 的应用程序中强制使用 Hikari,如今能够删除重写。
特别是,若是你有这样的设置:
1<dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring-boot-starter-data-jpa</artifactId>
4 <exclusions>
5 <exclusion>
6 <groupId>org.apache.tomcat</groupId>
7 <artifactId>tomcat-jdbc</artifactId>
8 </exclusion>
9 </exclusions>
10</dependency>
11
12<dependency>
13 <groupId>com.zaxxer</groupId>
14 <artifactId>HikariCP</artifactId>
15</dependency>复制代码
如今能够这样修改:
1<dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring-boot-starter-data-jpa</artifactId>
4</dependency>复制代码
从如今起,未明确启用的应用程序spring.jpa.open-in-view
将在启动过程当中收到警告消息。虽然这种行为是一种友好的默认行为,但若是您没有彻底意识到为您作了什么,这可能会致使问题。此消息可确保您了解可在查看呈现期间执行数据库查询。若是你没有问题,你能够明确地配置这个属性来消除警告信息。
在 Spring Boot 1.x 中,一些用户正在扩展HibernateJpaAutoConfiguration
以将高级自定义应用于自动配置EntityManagerFactory
。为了防止发生这种错误的用例,Spring Boot 2 中再也不可能扩展它。
为了支持这些用例,如今能够定义一个HibernatePropertiesCustomizer
bean,它能够彻底控制 Hibernate 属性,包括注册在上下文中声明为 bean 的 Hibernate 拦截器的能力。
Flyway 配置键被移动到spring
命名空间(即spring.flyway
)
升级到 Spring Boot 2 将会将 Flyway 升级3.x
到5.x
。为确保模式升级顺利进行,请按照如下说明操做:
1.5.x
Spring Boot 应用程序升级到 Flyway 4,请参阅Maven和Gradle的说明。 Liquibase 配置键被移动到spring
命名空间(即spring.liquibase
)
基本DataSource
初始化如今仅针对嵌入式数据源启用,并将在您使用生产数据库时当即关闭。新的spring.datasource.initialization-mode
(替换spring.datasource.initialize
)提供更多的控制。
spring.jpa.hibernate.ddl-auto
属性默认为只有在没有使用 Liquibase 或 Flyway 等模式管理器时才使用嵌入式数据库进行建立。一旦检测到模式管理器,默认更改成 none
。
如今使用的是 Lettuce 而不是 Jedis 做为 Redis 驱动程序spring-boot-starter-redis
。若是您使用更高级别的Spring Data 构造,则应该发现变化是透明的。咱们仍然支持 Jedis,若是您愿意,经过排除 io.lettuce:lettuce-core
并添加 redis.clients:jedis
,则能够自由切换依赖项。
Elasticsearch 已经升级到 6.0+。与 Elastic 宣布嵌入式 Elasticsearch 再也不受支持一致,自动配置NodeClient
已被删除。TransportClient
能够经过使用spring.data.elasticsearch.cluster-nodes
提供要链接的一个或多个节点的地址来自动配置。
用于缓存的专用 Hazelcast 自动配置。
没法自动配置常规HazelcastInstance
和专用HazelcastInstance
缓存。所以,该spring.cache.hazelcast.config
属性已再也不可用。
在启动时执行批处理做业的 CommandLineRunner 的顺序为 0。
Mockito 1.x 再也不支持@MockBean
和@SpyBean
。若是你不用spring-boot-starter-test
来管理你的依赖关系,你应该升级到 Mockito 2.x.
Spring Boot 2 为 Actuator 带来了重要变化,不管是内部仍是面向用户,请查阅参考指南中的更新部分和新的Actuator API文档。
您应该指望编程模型,配置密钥和某些端点的响应格式发生变化。Actuator 如今在 Spring MVC,Spring WebFlux 和Jersey 上获得本地支持。
Actuator 的代码分为两个模块:现有的spring-boot-actuator
和新的spring-boot-actuator-autoconfigure
。若是您使用原始模块(spring-boot-actuator
)导入执行器,请考虑使用spring-boot-starter-actuator
启动器替代它。
Endpoints 基础配置 key 已经统一:
旧的属性 |
新的属性 |
---|---|
endpoints.
|
management.endpoint.
|
endpoints.cors.* |
management.endpoints.web.cors.* |
endpoints.jmx.* |
management.endpoints.jmx.* |
management.address |
management.server.address |
management.context-path |
management.server.servlet.context-path |
management.ssl.* |
management.server.ssl.* |
management.port |
management.server.port |
全部 endpoints 默认状况下都已移至 /actuator
。
咱们修改了 management.server.servlet.context-path
的含义:它如今是 server.servlet.context-path
的端点管理等效物(只有在设置了 management.server.port
时才有效)。另外,您还可使用新的单独属性为管理端点设置基本路径:management.endpoints.web.base-path
。
例如,若是你设置management.server.servlet.context-path=/management
和management.endpoints.web.base-path=/application
,你就能够在下面的路径到达终点健康:/management/application/health
。
若是你想恢复 1.x 的行为(即具备/health
代替/actuator/health
),设置如下属性:
1management.endpoints.web.base-path=/复制代码
AuditEventRepository
如今有一个包含全部可选参数的单一方法。
要经过 HTTP 使执行器端点可用,它须要同时启用和公开。默认:
/health
和/info
端点都是暴露的。 /shutdown
已启用。 您能够按以下方式公开全部端点:
1management.endpoints.web.exposure.include=*复制代码
您能够经过如下方式显式启用/shutdown
端点:
1management.endpoint.shutdown.enabled=true复制代码
要公开全部(已启用)网络端点除env
端点以外:
1management.endpoints.web.exposure.include=*
2management.endpoints.web.exposure.exclude=env复制代码
端点属性已更改以下:
endpoints.
.enabled
已经转移到了 management.endpoint.
.enabled
endpoints.
.id
没有替换(端点的 ID 再也不可配置) endpoints.
.sensitive
没有替代品(请参见执行器安全) endpoints.
.path
已经转移到了 management.endpoints.web.path-mapping.
/actuator/mappings
端点大改变JSON 格式已经更改成如今正确地包含有关上下文层次结构,多个DispatcherServlets,
部署的 Servlet 和 Servlet 过滤器的信息。详情请参阅#9979。
Actuator API 文档的相关部分提供了一个示例文档。
/actuator/httptrace
端点大改变响应的结构已通过改进,以反映端点关注跟踪 HTTP 请求 - 响应交换的状况。
若是您有自定义执行器端点,请查看专用博客文章。该团队还撰写了一个 wiki 页面,介绍如何将现有的执行器端点迁移到新的基础架构。
Spring Boot本身的指标已被支持取代,包括自动配置,用于 icrometer 和 dimensional 指标。
若是您的 Spring Boot 2.0 应用程序已依赖于 Actuator,则 icrometer 已在此处并自动配置。若是您但愿将度量标准导出到 Prometheus,Atlas 或 Datadog 等外部注册表,Micrometer 将为许多注册表提供依赖关系; 您可使用spring.metrics.*
属性配置您的应用程序以导出到特定的注册表。
您能够经过如下方式建立各类指标,而不是在应用程序代码中注入CounterService
或GaugeService
实例化:
MeterRegistry
和调用方法。 Counter featureCounter = Metrics.counter("feature");
。 因为 Spring Loaded 项目已移至 attic,它在 Spring Boot 的支持已被删除。咱们建议使用 Devtools。
已经从 Devtools 中删除了对经过 HTTP 进行隧道远程调试的支持。
如下功能再也不可用:
commons-digester
。 如下库的最低支持版本已更改:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide
推荐阅读: