SpringBoot新特性之全局懶加載機(jī)制
關(guān)于延遲加載
在 Spring 中,默認(rèn)情況下所有定的 bean 及其依賴項(xiàng)目都是在應(yīng)用啟動(dòng)時(shí)創(chuàng)建容器上下文是被初始化的。測(cè)試代碼如下:
@Slf4j
@Configuration
public class DemoConfig {
public DemoConfig() {
log.warn(" > > > demoConfig 被初始化 > > >");
}
}
啟動(dòng)應(yīng)用日志:
[ 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 已經(jīng)被初始化創(chuàng)建。
一般情況程序在啟動(dòng)時(shí)時(shí)有大量的 Bean 需要初始化,例如 數(shù)據(jù)源初始化、緩存初始化等導(dǎo)致應(yīng)用程序啟動(dòng)非常的慢。在 spring boot 2.2 之前的版本,我們對(duì)這些 bean 使用手動(dòng)增加 「@Lazy」 注解,來(lái)實(shí)現(xiàn)啟動(dòng)時(shí)不初始化,業(yè)務(wù)程序在調(diào)用需要時(shí)再去初始化,如上代碼修改為即可:
@Lazy
@Configuration
public class DemoConfig {}
為什么需要全局懶加載
同上文中提到我們需要手動(dòng)在 bean 增加 「@Lazy」 注解,這就意味著我們僅能對(duì)程序中自行實(shí)現(xiàn)的 bean 進(jìn)行添加。但是現(xiàn)在 spring boot 應(yīng)用中引入了很多第三方 starter ,比如 druid-spring-boot-starter 數(shù)據(jù)源注入、spring-boot-starter-data-redis 緩存等默認(rèn)情況下, 引入即注入了相關(guān) bean 我們無(wú)法去修改添加 「@Lazy」。
spring boot 2.2 新增全局懶加載屬性,開啟后全局 bean 被設(shè)置為懶加載,需要時(shí)再去創(chuàng)建
spring: main: lazy-initialization: true #默認(rèn)false 關(guān)閉
個(gè)別 bean 可以通過(guò)設(shè)置 「@Lazy(false)」 排除,設(shè)置為啟動(dòng)時(shí)加載
@Lazy(false)
@Configuration
public class DemoConfig {}
當(dāng)然也可以指定規(guī)則實(shí)現(xiàn) LazyInitializationExcludeFilter 規(guī)則實(shí)現(xiàn)排除
@Bean
LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() {
return LazyInitializationExcludeFilter.forBeanTypes(DemoConfig.class);
}
全局懶加載的問(wèn)題
通過(guò)設(shè)置全局懶加載,我們可以減少啟動(dòng)時(shí)的創(chuàng)建任務(wù)從而大幅度的縮減應(yīng)用的啟動(dòng)時(shí)間。但全局懶加載的缺點(diǎn)可以歸納為以下兩點(diǎn):
- Http 請(qǐng)求處理時(shí)間變長(zhǎng)。 這里準(zhǔn)確的來(lái)說(shuō)是第一次 http 請(qǐng)求處理的時(shí)間變長(zhǎng),之后的請(qǐng)求不受影響(說(shuō)到這里自然而然的會(huì)聯(lián)系到 spring cloud 啟動(dòng)后的第一次調(diào)用超時(shí)的問(wèn)題)。
- 錯(cuò)誤不會(huì)在應(yīng)用啟動(dòng)時(shí)拋出,不利于早發(fā)現(xiàn)、早解決、早下班。
總結(jié)


以上源碼: spring-boot-course
到此這篇關(guān)于SpringBoot新特性之全局懶加載機(jī)制的文章就介紹到這了,更多相關(guān)SpringBoot 全局懶加載機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java使用freemarker模板生成html再轉(zhuǎn)為pdf
這篇文章主要為大家詳細(xì)介紹了java如何使用freemarker模板生成html,再利用iText將生成的HTML轉(zhuǎn)換為PDF文件,感興趣的小伙伴可以參考下2025-04-04
java顯示當(dāng)前運(yùn)行時(shí)的參數(shù)(java運(yùn)行參數(shù))
這篇文章主要介紹了java顯示當(dāng)前運(yùn)行時(shí)參數(shù)的示例(java運(yùn)行參數(shù)),需要的朋友可以參考下2014-04-04
導(dǎo)入maven項(xiàng)目各個(gè)注解均報(bào)錯(cuò)的解決方案
這篇文章主要介紹了導(dǎo)入maven項(xiàng)目各個(gè)注解均報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
MyEclipse+Tomcat+MAVEN+SVN項(xiàng)目完整環(huán)境搭建(圖文教程)
這篇文章主要介紹了MyEclipse+Tomcat+MAVEN+SVN項(xiàng)目完整環(huán)境搭建(圖文教程),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-12-12
解決java.lang.ClassCastException的java類型轉(zhuǎn)換異常的問(wèn)題
這篇文章主要介紹了解決java.lang.ClassCastException的java類型轉(zhuǎn)換異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java女裝商城系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)女裝商城系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
WebSocket實(shí)現(xiàn)系統(tǒng)后臺(tái)消息實(shí)時(shí)通知功能
在現(xiàn)代Web應(yīng)用中,提供實(shí)時(shí)通知對(duì)于改善用戶體驗(yàn)至關(guān)重要,WebSocket技術(shù)允許建立雙向通信通道,從系統(tǒng)后臺(tái)將消息實(shí)時(shí)傳送給系統(tǒng)用戶,下面我們就來(lái)深入探討一下如何使用WebSocket來(lái)實(shí)現(xiàn)這一功能吧2023-10-10

