「新特性」Spring Boot 全局懶加載機制瞭解一下

關於延遲加載

在 Spring 中,默認狀況下全部定的 bean 及其依賴項目都是在應用啓動時建立容器上下文是被初始化的。測試代碼以下:java

@Slf4j
@Configuration
public class DemoConfig {
    public DemoConfig() {
        log.warn(" > > > demoConfig 被初始化 > > >");
    }
}

啓動應用日誌:git

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

通常狀況程序在啓動時時有大量的 Bean 須要初始化,例如 數據源初始化、緩存初始化等致使應用程序啓動很是的慢。在 spring boot 2.2 以前的版本,咱們對這些 bean 使用手動增長 @Lazy 註解,來實現啓動時不初始化,業務程序在調用須要時再去初始化,如上代碼修改成便可:redis

@Lazy
@Configuration
public class DemoConfig {}

爲何須要全局懶加載

同上文中提到咱們須要手動在 bean 增長 @Lazy 註解,這就意味着咱們僅能對程序中自行實現的 bean 進行添加。可是如今 spring boot 應用中引入了不少第三方 starter ,好比 druid-spring-boot-starter 數據源注入、spring-boot-starter-data-redis 緩存等默認狀況下, 引入即注入了相關 bean 咱們沒法去修改添加 @Lazyspring

  • 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 啓動後的第一次調用超時的問題)。
  • 錯誤不會在應用啓動時拋出,不利於早發現、早解決、早下班。

總結

image

相關文章
相關標籤/搜索