Springboot2.2版本的延遲初始化

Springboot2.2版本的延遲初始化

在最近公佈的Spring Boot 2.2的第一個里程碑,引入了延遲初始化的支持。這篇文章描述這個新功能,並解釋瞭如何以及何時啓用它。

懶惰Lazy是什麼意思?

自從11年前源代碼遷移到Git之前,Spring Framework已經支持了延遲的bean初始化。默認情況下,在刷新應用程序上下文時,將創建上下文中的每個bean並注入其依賴。相反,如果將bean定義配置爲延遲初始化時,它就不會被創建,並且直到需要時才注入其依賴。

啓用延遲初始化

如果你樂於動手編寫一個BeanFactoryPostProcessor,那麼在任何版本的Spring Boot中都可以啓用延遲初始化。Spring Boot 2.2只是通過引入這種新的配置spring.main.lazy-initialization
讓延遲初始化變得更容易,(在SpringApplication和SpringApplicationBuilder中也有與這個新配置相同的方法),當其設置true爲時,bean在應用程序中的定義將被配置爲延遲初始化。

spring.main.lazy-initialization=true

延遲初始化的好處

延遲初始化可以顯著減少啓動時間,因爲在應用程序啓動期間加載的類和創建的bean更少。例如,一個使用執行器和Spring安全性的小型web應用程序通常在2500毫秒內啓動,它將在啓用延遲初始化的情況下在2000毫秒內啓動。具體的改進將因應用程序的不同而有所不同,這取決於bean依賴關係圖的結構。

DevTools怎麼樣?

Spring Boot的DevTools已經很明顯提高了開發人員的工作效率。與每次嘗試更改時都必須重啓JVM和應用程序不同,DevTools支持在相同的JVM中熱重啓應用程序。熱重啓的一個重要好處是,它使JIT有更多的機會優化啓動應用程序所涉及的代碼。重新啓動幾次後,原來的2500ms時間減少了近80%,接近500ms。使用延遲初始化,時間可以再次壓縮。設置spring.main.lazy-initialization=true,在IDE中可以看到應用程序重新啓動只需要400ms.

延遲初始化的缺點

正如上所述,啓用延遲初始化可以顯著減少啓動時間。你可能在想我要一直啓用它,或者在想爲什麼spring家族沒有默認啓用延遲初始化。延遲初始化有一些缺點,如果延遲初始話對你意義重大,那麼最好選擇使用它.

由於不再加載類,直到需要時纔會創建bean,所以延遲初始化可能會掩蓋以前在啓動時就已經確定的問題。此類問題可能包括no class def found錯誤、out of memory錯誤和由於錯誤的配置而導致的失敗。

在Web應用程序中,延遲初始化可能導致觸發Bean初始化的HTTP請求增加延遲,這通常只是第一個請求會這樣,但它可能會對負載均衡和自動擴展會產生負面影響。
在web應用程序中,延遲初始化會導致觸發bean初始化的HTTP請求的延遲增加。這通常只是第一個請求,但它可能會對負載均衡和自動擴展產生不利影響。

這個配置開啓了嗎?

如果您不確定延遲初始化對您的應用程序有什麼影響,或者您想驗證另一個框架的行爲是否滿足您的需求並匹配其聲明,那麼使用調試器可能會提供信息。通過在其中一個bean的構造函數中放置一個斷點,您可以看到它何時被初始化。例如,在啓用了延遲初始化的Spring Boot web應用程序中,您將看到直到向Spring MVC的DispatcherServlet或Spring WebFlux的DispatcherHandler發出第一個請求時纔會創建@Controller bean。

何時啓用延遲初始化

正如我們在上面看到的,延遲初始化可以在啓動時間上提供顯著的改進,但是也有一些顯著的缺點,謹慎地啓用它非常重要。

在開發過程中,延遲初始化是一個非常有益的領域,即使有缺點,也是非常少的。當你在一個應用程序需要迭代時,延遲初始化和DevTools的熱重啓所提供的縮短的啓動時間可以顯著提高您的工作效率。

另一個可以從延遲初始化中獲益的領域是應用程序的集成測試。你可能已經在使用Spring Boot的測試片,通過限制在某些類型的測試中初始化的bean的數量來減少測試執行時間。延遲初始化提供了另一種機制來實現類似的最終結果。如果您不能將應用程序的結構設置爲適合測試切片,或者對於特定類型的測試沒有可用的切片,則啓用延遲初始化將限制初始化的bean的數量,使之只適用於測試所需的bean。這將減少測試執行時間,特別是在開發期間單獨運行測試時。

最後,您可能需要考慮在生產中啓用延遲初始化。如果你這樣做了,就應該小心行事。對於web應用程序,容器編排可能受益於能夠更快響應的/health端點,但是您還需要注意,當嚮應用程序自己的端點之一發出第一個請求時,可能會增加延遲。您還應該注意調整應用程序的JVM大小,禁用延遲初始化,以避免在使用了應用程序的所有組件之後出現任何不必要的內存溢出錯誤。

原文鏈接:lazy-initializationspring-boot-2-2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章