zoukankan      html  css  js  c++  java
  • Spring Boot 2.0 迁移指南

    img

    前提

    本文档将帮助您把应用程序迁移到 Spring Boot 2.0。

    在你开始之前

    首先,Spring Boot 2.0需要Java 8或更高版本。Java 6 和 7 不再受支持。

    在 Spring Boot 2.0 中,许多配置属性被重新命名/删除,开发人员需要更新application.propertiesapplication.yml相应的配置。为了帮助你,Spring Boot 发布了一个新spring-boot-properties-migrator模块。一旦作为依赖添加到项目中,这不仅将分析应用程序的环境并在启动时打印诊断信息,而且还会在运行时为您暂时迁移属性。这是您的应用程序迁移期间必须具备的条件:

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

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

    构建您的 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.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 插件

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

    依赖管理

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

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

    1apply plugin: 'org.springframework.boot'
    2apply plugin: 'io.spring.dependency-management' // <-- add this to your build.gradle
    

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

    建立可执行的 Jars 和 Wars

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

    配置更新

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

    Spring Boot 特性

    默认代理策略

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

    SpringApplication

    Web 环境

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

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

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

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

    Spring Boot 应用程序事件更改

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

    请参阅更新的参考文档。

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

    外部化配置

    轻松的绑定

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

    1. 所有前缀必须是 kebab格式(小写,连字符分隔)acme.myProjectacme.my_project无效 - 您必须acme.my-project在此处使用。
    2. 属性名称可以使用 kebab-case(my-name),camel-case(myName)或 snake-case(my_name)。
    3. 环境属性(来自操作系统环境变量)必须使用通常的大写下划线格式,下划线只能用于分隔键的各个部分ACME_MYPROJECT_MYNAME

    这种新的放松绑定具有以下几个优点:

    • 无需担心密钥的结构@ConditionalOnProperty:只要密钥是以规范格式定义的,支持的松散变体就可以透明地工作。如果您正在使用该prefix属性,则现在只需使用namevalue属性即可放置完整密钥。
    • RelaxedPropertyResolver不再可以Environment自动处理:env.getProperty("com.foo.my-bar")将找到一个com.foo.myBar属性。

    org.springframework.boot.bind软件包不再可用,并被新的宽松绑定规则所取代。特别是,RelaxedDataBinder朋友已被新的BinderAPI 取代。以下样品MyPropertiesapp.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-mustachespring-boot-starter-freemarkerspring-boot-starter-thymeleaf不再依赖它。开发者有责任选择和添加spring-boot-starter-webspring-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-jdk8jackson-datatype-jsr310jackson-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 过滤器配置 ASYNCERROR以及 REQUEST 调度类型。

    RestTemplateBuilder

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

    WebJars 定位器

    Spring Boot 1.x 使用并提供依赖关系管理org.webjars:webjars-locatorwebjars-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.* 属性进行配置。要进一步定制用户或添加其他用户,您将不得不公开一个UserDetailsServicebean。

    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.xhealthinfo在默认情况下启用(与health默认情况下不显示其细节)。为了与这些新的默认值一致,health已被添加到第一个匹配器。

    使用 SQL 数据库

    配置数据源

    默认连接池已从 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>
    
    WARN 消息隐含的'打开在视图'

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

    JPA 和 Spring Data

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

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

    Flyway

    Flyway 配置键被移动到spring命名空间(即spring.flyway

    升级到 Spring Boot 2 将会将 Flyway 升级3.x5.x。为确保模式升级顺利进行,请按照以下说明操作:

    • 首先将您的1.5.xSpring 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,则可以自由切换依赖项。

    Elasticsearch

    Elasticsearch 已经升级到 6.0+。与 Elastic 宣布嵌入式 Elasticsearch 不再受支持一致,自动配置NodeClient已被删除。TransportClient可以通过使用spring.data.elasticsearch.cluster-nodes提供要连接的一个或多个节点的地址来自动配置。

    高速缓存

    用于缓存的专用 Hazelcast 自动配置。

    无法自动配置常规HazelcastInstance和专用HazelcastInstance缓存。因此,该spring.cache.hazelcast.config属性已不再可用。

    批量

    在启动时执行批处理作业的 CommandLineRunner 的顺序为 0。

    测试

    Mockito 1.x

    Mockito 1.x 不再支持@MockBean@SpyBean。如果你不用spring-boot-starter-test来管理你的依赖关系,你应该升级到 Mockito 2.x.

    Spring Boot Actuator

    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启动器替代它。

    Keys 的配置结构

    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=/managementmanagement.endpoints.web.base-path=/application,你就可以在下面的路径到达终点健康:/management/application/health

    如果你想恢复 1.x 的行为(即具有/health代替/actuator/health),设置以下属性:

    1management.endpoints.web.base-path=/
    

    审计事件 API 更改

    AuditEventRepository 现在有一个包含所有可选参数的单一方法。

    Endpoints

    要通过 HTTP 使执行器端点可用,它需要同时启用和公开。默认:

    • 无论您的应用程序中是否存在和配置 Spring Security,只有端点/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
    
    Endpoint changes

    img

    端点属性已更改如下:

    • 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 页面,介绍如何将现有的执行器端点迁移到新的基础架构。

    Metrics

    Spring Boot自己的指标已被支持取代,包括自动配置,用于 icrometer 和 dimensional 指标。

    设置 icrometer

    如果您的 Spring Boot 2.0 应用程序已依赖于 Actuator,则 icrometer 已在此处并自动配置。如果您希望将度量标准导出到 Prometheus,Atlas 或 Datadog 等外部注册表,Micrometer 将为许多注册表提供依赖关系; 您可以使用spring.metrics.*属性配置您的应用程序以导出到特定的注册表。

    迁移定制计数器/量表

    您可以通过以下方式创建各种指标,而不是在应用程序代码中注入CounterServiceGaugeService实例化:

    • 注入MeterRegistry和调用方法。
    • 直接调用静态方法Counter featureCounter = Metrics.counter("feature");

    开发者工具

    热拔插

    由于 Spring Loaded 项目已移至 attic,它在 Spring Boot 的支持已被删除。我们建议使用 Devtools。

    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


    推荐阅读:

    img

  • 相关阅读:
    面向对象-继承
    antd pro2.0 使用记录一:登录/注册/底部版权等设置
    vscode中git的配置
    电脑桌面文件夹出现在屏幕之外了,怎么解决
    百度网盘不限速-Motrix
    u盘在电脑读不出来,但别的可以读
    win10 命令重置 管理员密码
    nginx 配置
    react 记录:运行npm run eject命令暴露配置文件都报这个错误
    浏览器 连不上网 (3):DNS 服务器问题
  • 原文地址:https://www.cnblogs.com/springforall/p/11198337.html
Copyright © 2011-2022 走看看