![img](https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSZtxicnG0iaE0AvpUHI8oM7lxz1rRsmaa4IfbolVRG2WQwhXrchmVWS8Q/640?tp=webp&wxfrom=5&w ...
前提
本文檔將幫助您把應用程式遷移到 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=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 的任務。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
朋友已被新的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<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-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.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 中不再可能擴展它。
為了支持這些用例,現在可以定義一個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.<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=env
Endpoint 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
推薦閱讀:
- 一致性hash演算法 - consistent hashing
- JSON Web Token - 在Web應用間安全地傳遞信息
- 你真的瞭解lambda嗎?(糾錯篇)
- [譯] Kubernetes 兒童插圖指南
- Spring Boot 最流行的 16 條實踐解讀!
- SpringBoot使用Docker快速部署項目
- MAT入門到精通(一)
- 回調“地獄”與反應模式
- 乾貨 | Debezium實現Mysql到Elasticsearch高效實時同步