SpringBoot新特性之全局懶加載機制
關于延遲加載
在 Spring 中,默認情況下所有定的 bean 及其依賴項目都是在應用啟動時創(chuàng)建容器上下文是被初始化的。測試代碼如下:
@Slf4j @Configuration public class DemoConfig { public DemoConfig() { log.warn(" > > > demoConfig 被初始化 > > >"); } }
啟動應用日志:
[ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1193 ms [ main] c.p.c.global.lazy.config.DemoConfig : > > > demoConfig 被初始化 > > > [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
如上日志: 在 Tomcat started 之前 DemoConfig bean 已經被初始化創(chuàng)建。
一般情況程序在啟動時時有大量的 Bean 需要初始化,例如 數(shù)據源初始化、緩存初始化等導致應用程序啟動非常的慢。在 spring boot 2.2 之前的版本,我們對這些 bean 使用手動增加 「@Lazy」 注解,來實現(xiàn)啟動時不初始化,業(yè)務程序在調用需要時再去初始化,如上代碼修改為即可:
@Lazy @Configuration public class DemoConfig {}
為什么需要全局懶加載
同上文中提到我們需要手動在 bean 增加 「@Lazy」 注解,這就意味著我們僅能對程序中自行實現(xiàn)的 bean 進行添加。但是現(xiàn)在 spring boot 應用中引入了很多第三方 starter ,比如 druid-spring-boot-starter 數(shù)據源注入、spring-boot-starter-data-redis 緩存等默認情況下, 引入即注入了相關 bean 我們無法去修改添加 「@Lazy」。
spring boot 2.2 新增全局懶加載屬性,開啟后全局 bean 被設置為懶加載,需要時再去創(chuàng)建
spring: main: lazy-initialization: true #默認false 關閉
個別 bean 可以通過設置 「@Lazy(false)」 排除,設置為啟動時加載
@Lazy(false) @Configuration public class DemoConfig {}
當然也可以指定規(guī)則實現(xiàn) LazyInitializationExcludeFilter 規(guī)則實現(xiàn)排除
@Bean LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() { return LazyInitializationExcludeFilter.forBeanTypes(DemoConfig.class); }
全局懶加載的問題
通過設置全局懶加載,我們可以減少啟動時的創(chuàng)建任務從而大幅度的縮減應用的啟動時間。但全局懶加載的缺點可以歸納為以下兩點:
- Http 請求處理時間變長。 這里準確的來說是第一次 http 請求處理的時間變長,之后的請求不受影響(說到這里自然而然的會聯(lián)系到 spring cloud 啟動后的第一次調用超時的問題)。
- 錯誤不會在應用啟動時拋出,不利于早發(fā)現(xiàn)、早解決、早下班。
總結
以上源碼: spring-boot-course
到此這篇關于SpringBoot新特性之全局懶加載機制的文章就介紹到這了,更多相關SpringBoot 全局懶加載機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于Cookie與Session的Servlet?API會話管理操作
這篇文章主要為大家介紹了基于Cookie與Session的Servlet?API會話管理操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08解決springboot3.2集成mybatis-plus3.5.4.1報錯的問題
這篇文章給大家介紹了如何解決springboot3.2集成mybatis-plus3.5.4.1報錯的問題,文中通過圖文介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2023-12-12Java通過cellstyle屬性設置Excel單元格常用樣式的全面總結講解
在處理Excel文件時,經常需要對單元格進行樣式設置,以滿足特定的需求和美化要求,這篇文章主要給大家介紹了關于Java通過cellstyle屬性設置Excel單元格常用樣式的相關資料,需要的朋友可以參考下2024-01-01教你開發(fā)腳手架集成Spring?Boot?Actuator監(jiān)控的詳細過程
這篇文章主要介紹了開發(fā)腳手架集成Spring?Boot?Actuator監(jiān)控的詳細過程,集成包括引入依賴配置文件及訪問驗證的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05elasticsearch bucket 之rare terms聚合使用詳解
這篇文章主要為大家介紹了elasticsearch bucket 之rare terms聚合使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11