码迷,mamicode.com
首页 > 编程语言 > 详细

Spring Boot 2.0 迁移指南

时间:2019-07-17 00:06:01      阅读:43      评论:0      收藏:0      [点我收藏+]

标签:ken   build   jdb   顺序   lte   port   rect   消息   保护   

![img](https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSZtxicnG0iaE0AvpUHI8oM7lxz1rRsmaa4IfbolVRG2WQwhXrchmVWS8Q/640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) ### 前提 本文档将帮助您把应用程序迁移到 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 2 org.springframework.boot 3 spring-boot-properties-migrator 4 ``` 注意:完成迁移后,请确保从项目的依赖关系中删除此模块。 ### 构建您的 Spring Boot 应用程序 #### Spring Boot Maven 插件 如今暴露为属性的插件配置属性都以一个`spring-boot`前缀开始,以保持一致性并避免与其他插件发生冲突。 例如,以下命令`prod`使用命令行启用配置文件 ``` 1mvn spring-boot:run -Dspring-boot.run.profiles=prod ``` ##### Surefire 默认值 自定义包含/排除模式已与最新的 Surefire 默认设置保持一致。如果您依赖我们的,请相应地更新您的插件配置。他们曾经如下: ``` 1 2 org.apache.maven.plugins 3 maven-surefire-plugin 4 5 6 **/*Tests.java 7 **/*Test.java 8 9 10 **/Abstract*.java 11 12 13 ``` 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 的任务。`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 2 org.springframework.boot 3 spring-boot-starter-data-jpa 4 5 6 org.apache.tomcat 7 tomcat-jdbc 8 9 10 11 12 13 com.zaxxer 14 HikariCP 15 ``` 现在可以这样修改: ``` 1 2 org.springframework.boot 3 spring-boot-starter-data-jpa 4 ``` ##### 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`,则可以自由切换依赖项。 ##### 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..*` | `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=/ ``` #### 审计事件 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](https://mmbiz.qpic.cn/mmbiz_png/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSUyLfWBQDnjEMvktV5oxdfGDLkLQlwC51zdCdGYU4BZicKgdPWicuFxSw/640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 端点属性已更改如下: - `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 页面,介绍如何将现有的执行器端点迁移到新的基础架构。 ### Metrics Spring Boot自己的指标已被支持取代,包括自动配置,用于 icrometer 和 dimensional 指标。 #### 设置 icrometer 如果您的 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 远程调试隧道 已经从 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 ------ **推荐阅读**: - [一致性hash算法 - consistent hashing](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485714&idx=1&sn=55539dab6a03cec684cb3c527b31d35a&chksm=fb3f10e9cc4899ff897d38e23d92aabbfd9512436a3290ac4950447b8fc2ba69df9cfc644de8&scene=21#wechat_redirect) - [JSON Web Token - 在Web应用间安全地传递信息](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485718&idx=1&sn=4a07a1ae8eca21c87f04755d1ef3ab38&chksm=fb3f10edcc4899fbd221bcc8fea6918a3cc531865c6573bedcc9c5cd309e14f0b0015080b358&scene=21#wechat_redirect) - [你真的了解lambda吗?(纠错篇)](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485726&idx=1&sn=f0bb43842f595d73ee74e5e583890b87&chksm=fb3f10e5cc4899f3b4792d08025dcfda6387c3bcbf618561678cb6d37eece62426d980dfacfc&scene=21#wechat_redirect) - [[译\] Kubernetes 儿童插图指南](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485725&idx=2&sn=f0904ffbc3d1cce04bca3222ab2cae8e&chksm=fb3f10e6cc4899f0a56fa3568a9def6098e99b09be314c243cfe57d3fd416e9c19c25c0545b0&scene=21#wechat_redirect) - [Spring Boot 最流行的 16 条实践解读!](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485733&idx=1&sn=94e1fa48c45e21c642cd3cfcf36e1919&chksm=fb3f10decc4899c8d16b2d1c9f2f2ca3624ce8b151779c77c713e2bae88c4ef22e1254b42a15&scene=21#wechat_redirect) - [SpringBoot使用Docker快速部署项目](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485741&idx=1&sn=b048dfa7110ac22b09319af5806a8307&chksm=fb3f10d6cc4899c0338be7ba5c7b63688a8d8c0ce3d2a56d2db387636f9939c2a951f8280c60&scene=21#wechat_redirect) - [MAT入门到精通(一)](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485741&idx=2&sn=69947853fda57fd7df59a953f8328649&chksm=fb3f10d6cc4899c05f7c630665520d771930320f20e65415ab00f32c9187de1a3dd5f03b0859&scene=21#wechat_redirect) - [回调“地狱”与反应模式](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485746&idx=1&sn=a68c1c21c146c98170786e71d4bfbf40&chksm=fb3f10c9cc4899dff7d634eec19c6bfc627706a0ff5d3c62aaf4ea98a9b9376324b3c80f0e3c&scene=21#wechat_redirect) - [干货 | Debezium实现Mysql到Elasticsearch高效实时同步](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485750&idx=1&sn=65f2a6dda4486eec527056e0c22e0256&chksm=fb3f10cdcc4899db165681c361116c09f093a303dac1c3fd787d1b45a6eaf43c7bcfd90c4349&scene=21#wechat_redirect) ![img](https://mmbiz.qpic.cn/mmbiz_jpg/wbiax4xEAl5xa7FFaZo7VyJ5LQicljGCFOicKHziaovBFGstjMKKlxymS2IDPEzHEhpKykY3EFibz3zjPgxzdlMic0oA/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

Spring Boot 2.0 迁移指南

标签:ken   build   jdb   顺序   lte   port   rect   消息   保护   

原文地址:https://www.cnblogs.com/springforall/p/11198337.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!