本文檔將幫助您把應用程序遷移到 Spring Boot 2.0。html
首先,Spring Boot 2.0須要Java 8或更高版本。Java 6 和 7 再也不受支持。java
在 Spring Boot 2.0 中,許多配置屬性被從新命名/刪除,開發人員須要更新application.properties
/ application.yml
相應的配置。爲了幫助你,Spring Boot 發佈了一個新spring-boot-properties-migrator
模塊。一旦做爲依賴添加到項目中,這不只將分析應用程序的環境並在啓動時打印診斷信息,並且還會在運行時爲您暫時遷移屬性。這是您的應用程序遷移期間必須具有的條件:node
1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-properties-migrator</artifactId> 4</dependency>
注意:完成遷移後,請確保從項目的依賴關係中刪除此模塊。git
現在暴露爲屬性的插件配置屬性都以一個spring-boot
前綴開始,以保持一致性並避免與其餘插件發生衝突。github
例如,如下命令prod
使用命令行啓用配置文件web
1mvn spring-boot:run -Dspring-boot.run.profiles=prod
自定義包含/排除模式已與最新的 Surefire 默認設置保持一致。若是您依賴咱們的,請相應地更新您的插件配置。他們曾經以下:redis
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 插件在很大程度上已被重寫,以實現許多重大改進。您能夠在其參考文獻和API文檔中閱讀關於插件功能的更多信息。spring
Spring Boot 的 Gradle 插件再也不自動應用依賴管理插件。相反,Spring Boot 的插件如今能夠經過導入正確版本的spring-boot-dependencies BOM 來應用依賴管理插件。這使您能夠更好地控制配置依賴性管理的方式和時間。sql
對於大多數使用依賴管理插件的應用程序來講就足夠了:
1apply plugin: 'org.springframework.boot' 2apply plugin: 'io.spring.dependency-management' // <-- add this to your build.gradle
注意:依賴管理插件仍然是 spring-boot-gradle-plugin 的傳遞依賴項,因此不須要在 buildscript 配置中將其列爲類路徑依賴項。
該bootRepackage
任務已被替換bootJar
,並bootWar
分別創建可執行的 Jars 和 Wars 的任務。jar
和war
任務再也不參與。
BootRun
,BootJar
和BootWar
任務如今都使用mainClassName
的屬性來配置主類的名稱。這使得三個特定於引導的任務相互一致,並將其與 Gradle 本身的應用程序插件進行對齊。
Spring Boot 默認使用 CGLIB 代理,包括 AOP 支持。若是你須要基於代理的代理,你須要設置spring.aop.proxy-target-class
爲false
。
Spring Boot 應用程序如今能夠在更多模式下運行,所以spring.main.web-environment
如今不推薦使用屬性來支持spring.main.web-application-type
更多的控制。
若是您想確保應用程序不啓動 Web 服務器,則必須將該屬性更改成:
1spring.main.web-application-type=none
注意:還有一個setWebApplicationType
上SpringApplication
,若是你想這樣作編程。
咱們已經添加了一個新事件ApplicationStartedEvent
。 ApplicationStartedEvent
在上下文刷新以後但在任何應用程序和命令行參數被調用以前發送。 ApplicationReadyEvent
在任何應用程序和命令行參數被調用後發送。它表示應用程序已準備好爲請求提供服務。
請參閱更新的參考文檔。
在咱們限制 Spring Boot 使用的根名稱空間的數量的過程當中,與標誌相關的屬性已被重定位到spring.banner
。
有關寬鬆綁定的規則已經收緊。咱們假設一個現有的acme.my-project.my-name
屬性:
acme.myProject
或acme.my_project
無效 - 您必須acme.my-project
在此處使用。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
。
爲了支持反應性用例,嵌入式容器包結構已經被很是普遍地重構。 EmbeddedServletContainer
已被從新命名爲,WebServer
而且該org.springframework.boot.context.embedded
包已被從新定位到org.springframework.boot.web.embedded
。例如,若是您使用TomcatEmbeddedServletContainerFactory
回調接口定製嵌入式Tomcat容器,則應該使用TomcatServletWebServerFactory
。
許多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 |
之前有幾個 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
配置鍵來覆蓋此新的默認值。
在 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 應用程序中更改後綴路徑匹配的默認值(請參閱#11105)。按照 Spring Framework 中記錄的最佳實踐,此功能再也不默認啓用。
若是您的應用程序但願將請求"GET /projects/spring-boot.json"
映射到@GetMapping("/projects/spring-boot")
映射,則此更改會影響您。
有關此更多信息以及如何減輕此更改,請查閱Spring Boot中有關路徑匹配和內容協商的參考文檔。
Servlet 過濾器的默認調度程序類型如今是DipatcherType.REQUEST
; 這使 Spring Boot 的默認值與 Servlet 規範的默認值一致。若是您但願將過濾器映射到其餘調度程序類型,請使用FilterRegistrationBean
註冊您的過濾器。
注意:Spring Security 和 Spring Session 過濾器配置 ASYNC
, ERROR
以及 REQUEST
調度類型。
該requestFactory(ClientHttpRequestFactory)
方法已被新requestFactory(Supplier<ClientHttpRequestFactory> requestFactorySupplier)
方法所取代。Supplier
容許構建器生成的每一個模板使用它本身的請求工廠,從而避免共享工廠可能致使的反作用。見#11255。
Spring Boot 1.x 使用並提供依賴關係管理org.webjars:webjars-locator
。webjars-locator
是一個「命名不佳的庫……包裝webjars-locator-core
項目」。org.webjars:webjars-locator
應該更新依賴項來org.webjars:webjars-locator-core
代替使用。
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。
若是您想將 Spring Security AuthenticationManager
做爲 bean 公開,請覆蓋authenticationManagerBean
您的方法WebSecurityConfigurerAdapter
併爲其添加註釋@Bean
。
從功能的 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
已被添加到第一個匹配器。
默認鏈接池已從 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>
從如今起,未明確啓用的應用程序spring.jpa.open-in-view
將在啓動過程當中收到警告消息。雖然這種行爲是一種友好的默認行爲,但若是您沒有徹底意識到爲您作了什麼,這可能會致使問題。此消息可確保您瞭解可在查看呈現期間執行數據庫查詢。若是你沒有問題,你能夠明確地配置這個屬性來消除警告信息。
在 Spring Boot 1.x 中,一些用戶正在擴展HibernateJpaAutoConfiguration
以將高級自定義應用於自動配置EntityManagerFactory
。爲了防止發生這種錯誤的用例,Spring Boot 2 中再也不可能擴展它。
爲了支持這些用例,如今能夠定義一個HibernatePropertiesCustomizer
bean,它能夠徹底控制 Hibernate 屬性,包括註冊在上下文中聲明爲 bean 的 Hibernate 攔截器的能力。
Flyway 配置鍵被移動到spring
命名空間(即spring.flyway
)
升級到 Spring Boot 2 將會將 Flyway 升級3.x
到5.x
。爲確保模式升級順利進行,請按照如下說明操做:
1.5.x
Spring Boot 應用程序升級到 Flyway 4,請參閱Maven和Gradle的說明。Liquibase 配置鍵被移動到spring
命名空間(即spring.liquibase
)
基本DataSource
初始化如今僅針對嵌入式數據源啓用,並將在您使用生產數據庫時當即關閉。新的spring.datasource.initialization-mode
(替換spring.datasource.initialize
)提供更多的控制。
spring.jpa.hibernate.ddl-auto
屬性默認爲只有在沒有使用 Liquibase 或 Flyway 等模式管理器時才使用嵌入式數據庫進行建立。一旦檢測到模式管理器,默認更改成 none
。
如今使用的是 Lettuce 而不是 Jedis 做爲 Redis 驅動程序spring-boot-starter-redis
。若是您使用更高級別的Spring Data 構造,則應該發現變化是透明的。咱們仍然支持 Jedis,若是您願意,經過排除 io.lettuce:lettuce-core
並添加 redis.clients:jedis
,則能夠自由切換依賴項。
Elasticsearch 已經升級到 6.0+。與 Elastic 宣佈嵌入式 Elasticsearch 再也不受支持一致,自動配置NodeClient
已被刪除。TransportClient
能夠經過使用spring.data.elasticsearch.cluster-nodes
提供要鏈接的一個或多個節點的地址來自動配置。
用於緩存的專用 Hazelcast 自動配置。
沒法自動配置常規HazelcastInstance
和專用HazelcastInstance
緩存。所以,該spring.cache.hazelcast.config
屬性已再也不可用。
在啓動時執行批處理做業的 CommandLineRunner 的順序爲 0。
Mockito 1.x 再也不支持@MockBean
和@SpyBean
。若是你不用spring-boot-starter-test
來管理你的依賴關係,你應該升級到 Mockito 2.x.
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
啓動器替代它。
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=/
AuditEventRepository
如今有一個包含全部可選參數的單一方法。
要經過 HTTP 使執行器端點可用,它須要同時啓用和公開。默認:
/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
端點屬性已更改以下:
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 頁面,介紹如何將現有的執行器端點遷移到新的基礎架構。
Spring Boot本身的指標已被支持取代,包括自動配置,用於 icrometer 和 dimensional 指標。
若是您的 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 中刪除了對經過 HTTP 進行隧道遠程調試的支持。
如下功能再也不可用:
commons-digester
。如下庫的最低支持版本已更改:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide
推薦閱讀: