希望本文档将帮助您把应用程序迁移到 Spring Boot 2.0。
首先,Spring Boot 2.0 需要 Java 8 或更高版本。不再支持 Java 6 和 7 了。
在 Spring Boot 2.0 中,许多配置属性被重新命名/删除,开发人员需要更新 application.properties
/ application.yml
相应的配置。为了帮助你解决这一问题,Spring Boot 发布了一个新 spring-boot-properties-migrator
模块。一旦作为该模块作为依赖被添加到你的项目中,它不仅会分析应用程序的环境,而且还会在启动时打印诊断信息,而且还会在运行时为您暂时迁移属性。在您的应用程序迁移期间,这个模块是必备的:
org.springframework.boot
spring-boot-properties-migrator
注意:完成迁移后,请确保从项目的依赖关系中删除此模块。
为了保持了一致性,并且避免与其他插件发生冲突,现在暴露的插件配置属性都以一个 spring-boot
前缀开始。
例如,以下命令 prod
使用命令行启用配置文件
mvn spring-boot:run -Dspring-boot.run.profiles=prod
以前的 include/exclude
模式已与最新的 Surefire 默认设置保持一致。如果依赖于此插件,需要相应地更新插件配置。之前对应的配置如下:
org.apache.maven.plugins
maven-surefire-plugin
**/*Tests.java
**/*Test.java
**/Abstract*.java
PS: 如果您使用 JUnit 5,则应将 Surefire 降级到 2.19.1
。该 **/*Tests.java
版本不包含此模式,因此如果您依赖该模式,请确保将其添加到您的配置中。
Spring Boot 的 Gradle 插件在很大程度上已被重写,有了重大的改进。您可以在其参考文献和API文档中阅读关于插件功能的更多信息。
Spring Boot 的 Gradle 插件不再自动应用依赖管理插件。相反,Spring Boot 的插件现在可以通过导入正确版本的spring-boot-dependencies BOM 来应用依赖管理插件。当依赖管理被配置的时候,这一点会让你有更多的控制权。
对于大多数应用程序,使用应用依赖管理插件就足够了:
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' // <-- add this to your build.gradle
注意:依赖管理插件仍然是 spring-boot-gradle-plugin 的传递依赖项,所以不需要在 buildscript 配置中将其列为类路径依赖项。
bootRepackage
任务已经被替换成 bootJar
和 bootWar
任务,分别用于构建可执行的 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 服务器,则必须将该属性更改为:
spring.main.web-application-type=none
注意:可以通过 SpringApplication
的 setWebApplicationType
方法实现。
我们已经添加了一个新事件 ApplicationStartedEvent
。 ApplicationStartedEvent
在上下文刷新之后但在任何应用程序和命令行参数被调用之前发送。 ApplicationReadyEvent
在任何应用程序和命令行参数被调用后发送。它表示应用程序已准备好为请求提供服务。
请参阅更新的参考文档。
在我们限制 Spring Boot 使用的根名称空间的数量的过程中,与标志相关的属性已被重定位到 spring.banner
。
有关宽松绑定的规则已经收紧。我们假设一个现有的 acme.my-project.my-name
属性:
所有前缀必须是 kebab格式(小写,连字符分隔) acme.myProject
或 acme.my_project
无效 - 您必须 acme.my-project
在此处使用。
属性名称可以使用 kebab-case( 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
前缀中进行绑定。
MyProperties target = Binder.get(environment)
.bind("app.acme", MyProperties.class)
.orElse(null);
由于现在内置了轻松绑定,因此只要使用其中一种支持的格式,就可以请求任何属性而不必关心案例:
FlagType flagType = Binder.get(environment)
.bind("acme.app.my-flag", FlagType.class)
.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
。在 SpringWebFlux
新的支持下, 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 配置的默认值,将 ISO-8601 字符串 写为 JSR-310 日期 。如果你想回到以前的行为,你可以添加 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<ClientHttpRequestFactory>requestFactorySupplier)
方法所取代。 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
就会退出,而不是进行多种与安全性相关的自动配置。
如果您使用以下任何属性,则会受到影响:
security.basic.authorize-mode
security.basic.enabled
security.basic.path
security.basic.realm
security.enable-csrf
security.headers.cache
security.headers.content-security-policy
security.headers.content-security-policy-mode
security.headers.content-type
security.headers.frame
security.headers.hsts
security.headers.xss
security.ignored
security.require-ssl
security.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
每个端点的标志也没有在安全配置中变得更加明确。如果您依赖于此行为,则需要创建或调整您的安全配置,以保护您选择角色的端点。
例如,假设以下配置:
endpoints.flyway.sensitive=false
endpoints.info.sensitive=true
management.security.roles=MY_ADMIN
http
.authorizeRequests()
.requestMatchers(EndpointRequest.to("health", "flyway")).permitAll()
.requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("MY_ADMIN")
...
需要注意的是在 2.x
, health
和 info
在默认情况下启用(与 health
默认情况下不显示其细节)。为了与这些新的默认值一致, health
已被添加到第一个匹配器。
默认连接池已从 Tomcat 切换到 HikariCP。如果您过去 spring.datasource.type
在基于 Tomcat 的应用程序中强制使用 Hikari,现在可以删除重写。
特别是,如果你有这样的设置:
org.springframework.boot
spring-boot-starter-data-jpa
org.apache.tomcat
tomcat-jdbc
com.zaxxer
HikariCP
现在可以这样修改:
org.springframework.boot
spring-boot-starter-data-jpa
从现在起,未明确启用的应用程序 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的说明。
一旦您的架构升级到了 Flyway 4,升级到 Spring Boot 2 并再次运行迁移以将您的应用程序移植到 Flyway 5。
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
)导入 actuator,请考虑使用 spring-boot-starter-actuator
启动器替代它。
Endpoints 基础配置 key 已经统一:
旧的属性 | 新的属性 |
---|---|
endpoints.<id>.* |
management.endpoint.<id>.* |
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
),设置以下属性:
management.endpoints.web.base-path=/
AuditEventRepository
现在有一个包含所有可选参数的单一方法。
要通过 HTTP 使执行器端点可用,它需要同时启用和公开。默认:
无论您的应用程序中是否存在和配置 Spring Security,只有端点 /health
和 /info
端点都是暴露的。
所有端点,但 /shutdown
已启用。
您可以按如下方式公开所有端点:
management.endpoints.web.exposure.include=*
您可以通过以下方式显式启用 /shutdown
端点:
management.endpoint.shutdown.enabled=true
要公开所有(已启用)网络端点除 env
端点之外:
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env
1.x 端点 | 2.0 端点(改变) |
---|---|
/actuator |
不再可用。 但是,在 management.endpoints.web.base-path 的根目录中有一个映射,它提供了到所有暴露端点的链接。 |
/auditevents |
该 after 参数不再需要 |
/autoconfig |
重命名为 /conditions |
/docs |
不再可用 |
/health |
现在有一个 management.endpoint.health.show-details 选项never , always , when-authenticated ,而不是依靠 sensitive 标志来确定 health 端点是否必须显示全部细节。 默认情况下, /actuator/health 公开并且不显示细节。 |
/trace |
重命名为 /httptrace |
端点属性已更改如下:
endpoints.<id>.enabled
已经转移到了 management.endpoint.<id>.enabled
endpoints.<id>.id
没有替换(端点的 ID 不再可配置)
endpoints.<id>.sensitive
没有替代品(请参见执行器安全)
endpoints.<id>.path
已经转移到了 management.endpoints.web.path-mapping.<id>
/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
和调用方法。
直接调用静态方法 CounterfeatureCounter=Metrics.counter("feature");
。
由于 Spring Loaded 项目被搁置,它在 Spring Boot 的支持已被删除。我们建议使用 Devtools。
已经从 Devtools 中删除了对通过 HTTP 进行隧道远程调试的支持。
以下功能不再可用:
CRaSH 支持
Spring Mobile 的自动配置和依赖关系管理。
Spring Social 的自动配置和依赖关系管理。
依赖关系管理 commons-digester
。
以下库的最低支持版本已更改:
Elasticsearch 5.6
Gradle 4
Hibernate 5.2
Jetty 9.4
Spring Framework 5
Spring Security 5
Tomcat 8.5
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide
Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent
Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
Spring Boot 2.0正式发布,升还是不升呢?
Spring Boot 2.0 新特性概览
Spring Boot/Cloud干货汇总
Spring Cloud Gateway真的有那么差吗?
长按指纹
一键关注
深入交流、更多福利
扫码加入我的知识星球
点击 “阅读原文” 看看本号其他精彩内容