1. 程式人生 > >Spring Boot 2.0 遷移指南

Spring Boot 2.0 遷移指南

![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&