在 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 咱們沒法去修改添加 @Lazy。spring
spring: main: lazy-initialization: true #默認false 關閉
@Lazy(false) @Configuration public class DemoConfig {}
@Bean LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() { return LazyInitializationExcludeFilter.forBeanTypes(DemoConfig.class); }
經過設置全局懶加載,咱們能夠減小啓動時的建立任務從而大幅度的縮減應用的啓動時間。但全局懶加載的缺點能夠概括爲如下兩點:緩存