關于延遲加載
在 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 啟動后的第一次呼叫超時的問題),
-
錯誤不會在應用啟動時拋出,不利于早發現、早解決、早下班,
總結


- 以上原始碼: spring-boot-course
專案推薦: Spring Cloud 、Spring Security OAuth2的RBAC權限管理系統 歡迎關注
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/142352.html
標籤:Java
上一篇:資料源管理 | 搜索引擎框架,ElasticSearch集群模式
下一篇:Python基礎-07集合
