专栏名称: 朱小厮的博客
著有畅销书:《深入理解Kafka》和《RabbitMQ实战指南》。公众号主要用来分享Java技术栈、Golang技术栈、消息中间件(如Kafka、RabbitMQ)、存储、大数据以及通用型技术架构等相关的技术。
目录
相关文章推荐
湾区最新闻  ·  速查!2025年研考国家线发布 ·  22 小时前  
湾区最新闻  ·  速查!2025年研考国家线发布 ·  22 小时前  
第1眼新闻  ·  今日9点起,重庆正式公布!5个查询通道→ ·  昨天  
第1眼新闻  ·  今日9点起,重庆正式公布!5个查询通道→ ·  昨天  
央广网  ·  明天起出分!转存这份复试全攻略→ ·  2 天前  
央广网  ·  明天起出分!转存这份复试全攻略→ ·  2 天前  
四川大学本科招生  ·  川大新学期,昂扬起航! ·  2 天前  
四川大学本科招生  ·  川大新学期,昂扬起航! ·  2 天前  
兰州大学萃英在线  ·  “北方飘来的雪,带来我思念的回信” ·  6 天前  
51好读  ›  专栏  ›  朱小厮的博客

Spring Boot 2.0 迁移指南

朱小厮的博客  · 公众号  ·  · 2019-09-16 17:35

正文

点击上方“ 朱小厮的博客 ”,选择“ 设为星标

回复” 666 “获取新整理的1000+GB资料

前提

本文档将帮助您把应用程序迁移到 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 模块。 一旦作为依赖添加到项目中,这不仅将分析应用程序的环境并在启动时打印诊断信息,而且还会在运行时为您暂时迁移属性。 这是您的应用程序迁移期间必须具备的条件:

1<dependency>
2    <groupId>org.springframework.bootgroupId>
3    <artifactId>spring-boot-properties-migratorartifactId>
4dependency>

注意: 完成迁移后,请确保从项目的依赖关系中删除此模块。

构建您的 Spring Boot 应用程序

Spring Boot Maven 插件

如今暴露为属性的插件配置属性都以一个 spring-boot 前缀开始,以保持一致性并避免与其他插件发生冲突。

例如,以下命令 prod 使用命令行启用配置文件

1mvn spring-boot:run -Dspring-boot.run.profiles=prod
Surefire 默认值

自定义包含/排除模式已与最新的 Surefire 默认设置保持一致。 如果您依赖我们的,请相应地更新您的插件配置。 他们曾经如下:

 1<plugin>
2    <groupId>org.apache.maven.pluginsgroupId>
3    <artifactId>maven-surefire-pluginartifactId>
4    <configuration>
5        <includes>
6             <include>**/*Tests.javainclude>
7             <include>**/*Test.javainclude>
8        includes>
9        <excludes>
10            <exclude>**/Abstract*.javaexclude>
11        excludes>
12    configuration>
13plugin>

PS: 如果您使用 JUnit 5,则应将 Surefire 降级到 2.19.1 **/*Tests.java 版本不包含此模式,因此如果您依赖该模式,请确保将其添加到您的配置中。

Spring Boot Gradle 插件

Spring Boot 的 Gradle 插件在很大程度上已被重写,以实现许多重大改进。 您可以在其参考文献和API文档中阅读关于插件功能的更多信息。

依赖管理

Spring Boot 的 Gradle 插件不再自动应用依赖管理插件。 相反,Spring Boot 的插件现在可以通过导入正确版本的spring-boot-dependencies BOM 来应用依赖管理插件。 这使您可以更好地控制配置依赖性管理的方式和时间。

对于大多数使用依赖管理插件的应用程序来说就足够了:

1apply plugin: 'org.springframework.boot'
2apply plugin: 'io.spring.dependency-management' //

注意: 依赖管理插件仍然是 spring-boot-gradle-plugin 的传递依赖项,所以不需要在 buildscript 配置中将其列为类路径依赖项。

建立可执行的 Jars 和 Wars

bootRepackage 任务已被替换 bootJar ,并 bootWar 分别建立可执行的 Jars 和 Wars 的任务。 jar war 任务不再参与。

配置更新

BootRun BootJar BootWar 任务现在都使用 mainClassName 的属性来配置主类的名称。 这使得三个特定于引导的任务相互一致,并将其与 Gradle 自己的应用程序插件进行对齐。

Spring Boot 特性

默认代理策略

Spring Boot 默认使用 CGLIB 代理,包括 AOP 支持。 如果你需要基于代理的代理,你需要设置 spring.aop.proxy-target-class false

SpringApplication

Web 环境

Spring Boot 应用程序现在可以在更多模式下运行,因此 spring.main.web-environment 现在不推荐使用属性来支持 spring.main.web-application-type 更多的控制。

如果您想确保应用程序不启动 Web 服务器,则必须将该属性更改为:

1spring.main.web-application-type=none

注意: 还有一个 setWebApplicationType SpringApplication ,如果你想这样做编程。

Spring Boot 应用程序事件更改

我们已经添加了一个新事件 ApplicationStartedEvent ApplicationStartedEvent 在上下文刷新之后但在任何应用程序和命令行参数被调用之前发送。 ApplicationReadyEvent 在任何应用程序和命令行参数被调用后发送。 它表示应用程序已准备好为请求提供服务。

请参阅更新的参考文档。

Banner

在我们限制 Spring Boot 使用的根名称空间的数量的过程中,与标志相关的属性已被重定位到 spring.banner

外部化配置

轻松的绑定

有关宽松绑定的规则已经收紧。 我们假设一个现有的 acme.my-project.my-name 属性:

  1. 所有前缀必须是 kebab格式(小写,连字符分隔) acme.myProject acme.my_project 无效 - 您必须 acme.my-project 在此处使用。

  2. 属性名称可以使用 kebab-case( my-name ),camel-case( myName )或 snake-case( my_name )。

  3. 环境属性(来自操作系统环境变量) 必须使用 通常的大写下划线格式,下划线 只能 用于分隔键的各个部分 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

开发 Web 应用程序

嵌入式容器包装结构

为了支持反应性用例,嵌入式容器包结构已经被非常广泛地重构。 EmbeddedServletContainer 已被重新命名为, WebServer 并且该 org.springframework.boot.context.embedded 包已被重新定位到 org.springframework.boot.web.embedded 例如,如果您使用 TomcatEmbeddedServletContainerFactory 回调接口定制嵌入式Tomcat容器,则应该使用 TomcatServletWebServerFactory

特定于 Servlet 的服务器属性

许多 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
Web Starter 作为传递依赖

以前有几个 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 配置键来覆盖此新的默认值。

Jackson / JSON 支持

在 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 路径匹配默认行为更改

我们已决定在 Spring MVC 应用程序中更改后缀路径匹配的默认值(请参阅#11105)。 按照 Spring Framework 中记录的最佳实践,此功能不再默认启用。

如果您的应用程序希望将请求 "GET /projects/spring-boot.json" 映射到 @GetMapping("/projects/spring-boot") 映射,则此更改会影响您。

有关此更多信息以及如何减轻此更改,请查阅Spring Boot中有关路径匹配和内容协商的参考文档。

Servlet 过滤器

Servlet 过滤器的默认调度程序类型现在是 DipatcherType.REQUEST ; 这使 Spring Boot 的默认值与 Servlet 规范的默认值一致。 如果您希望将过滤器映射到其他调度程序类型,请使用 FilterRegistrationBean 注册您的过滤器。

注意: Spring Security 和 Spring Session 过滤器配置 ASYNC , ERROR 以及 REQUEST 调度类型。

RestTemplateBuilder

requestFactory(ClientHttpRequestFactory) 方法已被新 requestFactory(Supplier requestFactorySupplier) 方法所取代。 Supplier 允许构建器生成的每个模板使用它自己的请求工厂,从而避免共享工厂可能导致的副作用。 见#11255。

WebJars 定位器

Spring Boot 1.x 使用并提供依赖关系管理 org.webjars:webjars-locator webjars-locator 是一个“命名不佳的库……包装 webjars-locator-core 项目”。 org.webjars:webjars-locator 应该更新依赖项来 org.webjars:webjars-locator-core 代替使用。

Security

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。

AuthenticationManager Bean

如果您想将 Spring Security AuthenticationManager 作为 bean 公开,请覆盖 authenticationManagerBean 您的方法 WebSecurityConfigurerAdapter 并为其添加注释 @Bean

OAuth2

从功能的 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 已被添加到第一个匹配器。

使用 SQL 数据库

配置数据源

默认连接池已从 Tomcat 切换到 HikariCP。 如果您过去 spring.datasource.type 在基于 Tomcat 的应用程序中强制使用 Hikari,现在可以删除重写。

特别是,如果你有这样的设置:

 1<dependency>
2    <groupId>org.springframework.bootgroupId>
3    <artifactId>spring-boot-starter-data-jpaartifactId>
4    <exclusions>
5        <exclusion>
6            <groupId>org.apache.tomcatgroupId>
7            <artifactId>tomcat-jdbcartifactId>
8        exclusion>
9    exclusions>
10dependency>
11
12<dependency>
13    <groupId>com.zaxxergroupId>
14    <artifactId>HikariCPartifactId>
15dependency>

现在可以这样修改:

1<dependency>
2    <groupId>org.springframework.bootgroupId>
3    <artifactId>spring-boot-starter-data-jpaartifactId>
4dependency>
WARN 消息隐含的'打开在视图'

从现在起,未明确启用的应用程序 spring.jpa.open-in-view 将在启动过程中收到警告消息。 虽然这种行为是一种友好的默认行为,但如果您没有完全意识到为您做了什么,这可能会导致问题。 此消息可确保您了解可在查看呈现期间执行数据库查询。 如果你没有问题,你可以明确地配置这个属性来消除警告信息。

JPA 和 Spring Data

在 Spring Boot 1.x 中,一些用户正在扩展 HibernateJpaAutoConfiguration 以将高级自定义应用于自动配置 EntityManagerFactory 为了防止发生这种错误的用例,Spring Boot 2 中不再可能扩展它。

为了支持这些用例,现在可以定义一个 HibernatePropertiesCustomizer bean,它可以完全控制 Hibernate 属性,包括注册在上下文中声明为 bean 的 Hibernate 拦截器的能力。

Flyway

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

Liquibase 配置键被移动到 spring 命名空间(即 spring.liquibase

数据库初始化

基本 DataSource 初始化现在仅针对嵌入式数据源启用,并将在您使用生产数据库时立即关闭。 新的 spring.datasource.initialization-mode (替换 spring.datasource.initialize )提供更多的控制。

更新默认的'创建 - 删除'处理

spring.jpa.hibernate.ddl-auto 属性默认为只有在没有使用 Liquibase 或 Flyway 等模式管理器时才使用嵌入式数据库进行创建。 一旦检测到模式管理器,默认更改为 none

整合 NoSQL

Redis

现在使用的是 Lettuce 而不是 Jedis 作为 Redis 驱动程序 spring-boot-starter-redis 如果您使用更高级别的Spring Data 构造,则应该发现变化是透明的。 我们仍然支持 Jedis,如果您愿意,通过排除 io.lettuce: lettuce-core 并添加 redis.clients: jedis







请到「今天看啥」查看全文


推荐文章
湾区最新闻  ·  速查!2025年研考国家线发布
22 小时前
湾区最新闻  ·  速查!2025年研考国家线发布
22 小时前
四川大学本科招生  ·  川大新学期,昂扬起航!
2 天前
四川大学本科招生  ·  川大新学期,昂扬起航!
2 天前
兰州大学萃英在线  ·  “北方飘来的雪,带来我思念的回信”
6 天前
纸上建筑  ·  一次性纸杯也要清真么?
7 年前