在 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); }
经过设置全局懒加载,咱们能够减小启动时的建立任务从而大幅度的缩减应用的启动时间。但全局懒加载的缺点能够概括为如下两点:缓存