javascript
Spring Boot 2.0 迁移指南
點擊上方“朱小廝的博客”,選擇“設為星標”
回復”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.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=prodSurefire 默認值
自定義包含/排除模式已與最新的 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 的任務。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屬性:
所有前綴必須是 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朋友已被新的BinderAPI 取代。以下樣品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<ClientHttpRequestFactory> 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-mode2security.basic.enabled3security.basic.path4security.basic.realm5security.enable-csrf6security.headers.cache7security.headers.content-security-policy8security.headers.content-security-policy-mode9security.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.x,health和info在默認情況下啟用(與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.x到5.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=/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=envEndpoint changes
端點屬性已更改如下:
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.*屬性配置您的應用程序以導出到特定的注冊表。
遷移定制計數器/量表
您可以通過以下方式創建各種指標,而不是在應用程序代碼中注入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
想知道更多?掃描下面的二維碼關注我
加技術群入口(備注:Tech):
免費星球入口:
最近整理了一份資料,包含Java技術棧、消息中間件、分布式存儲、大數據、高可用架構、通用型技術架構等。獲取方式:點擊「在看」,關注公眾號并在后臺回復“666”即可獲取。
朕已閱?
總結
以上是生活随笔為你收集整理的Spring Boot 2.0 迁移指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中秋干货 | 架构进阶之路上的实时数仓
- 下一篇: Spring事务“套路”面试