1. 程式人生 > 程式設計 >SpringBoot新特性之全域性懶載入機制

SpringBoot新特性之全域性懶載入機制

關於延遲載入

在 Spring 中,預設情況下所有定的 bean 及其依賴專案都是在應用啟動時建立容器上下文是被初始化的。測試程式碼如下:

@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 已經被初始化建立。

一般情況程式在啟動時時有大量的 Bean 需要初始化,例如 資料來源初始化、快取初始化等導致應用程式啟動非常的慢。在 spring boot 2.2 之前的版本,我們對這些 bean 使用手動增加 「@Lazy」 註解,來實現啟動時不初始化,業務程式在呼叫需要時再去初始化,如上程式碼修改為即可:

@Lazy
@Configuration
public class DemoConfig {}

為什麼需要全域性懶載入

同上文中提到我們需要手動在 bean 增加 「@Lazy」 註解,這就意味著我們僅能對程式中自行實現的 bean 進行新增。但是現在 spring boot 應用中引入了很多第三方 starter ,比如 druid-spring-boot-starter 資料來源注入、spring-boot-starter-data-redis 快取等預設情況下, 引入即注入了相關 bean 我們無法去修改新增 「@Lazy」。

spring boot 2.2 新增全域性懶載入屬性,開啟後全域性 bean 被設定為懶載入,需要時再去建立

spring:
 main:
 lazy-initialization: true #預設false 關閉

個別 bean 可以通過設定 「@Lazy(false)」 排除,設定為啟動時載入

@Lazy(false)
@Configuration
public class DemoConfig {}

當然也可以指定規則實現 LazyInitializationExcludeFilter 規則實現排除

@Bean
 LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() {
 return LazyInitializationExcludeFilter.forBeanTypes(DemoConfig.class);
}

全域性懶載入的問題

通過設定全域性懶載入,我們可以減少啟動時的建立任務從而大幅度的縮減應用的啟動時間。但全域性懶載入的缺點可以歸納為以下兩點:

  • Http 請求處理時間變長。 這裡準確的來說是第一次 http 請求處理的時間變長,之後的請求不受影響(說到這裡自然而然的會聯絡到 spring cloud 啟動後的第一次呼叫超時的問題)。
  • 錯誤不會在應用啟動時丟擲,不利於早發現、早解決、早下班。

總結

SpringBoot新特性之全域性懶載入機制

SpringBoot新特性之全域性懶載入機制

以上原始碼: spring-boot-course

到此這篇關於SpringBoot新特性之全域性懶載入機制的文章就介紹到這了,更多相關SpringBoot 全域性懶載入機制內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!