SpringBoot延迟加载

一,引言

在 Spring Boot 中,延迟加载(Lazy Initialization)是指在应用程序启动时不立即初始化所有的 Spring Bean,而是在需要使用这些 Bean 时才进行初始化。延迟加载可以帮助缩短应用程序的启动时间,尤其是在 Bean 数量较多或者某些 Bean 初始化过程较为耗时的情况下。

二,全局加载

Spring Boot 2.2 及其之后的版本支持全局延迟加载配置,可以通过在 application.propertiesapplication.yml 文件中配置来启用。

spring:
  main:
    lazy-initialization: true

启用全局延迟加载后,所有的 Spring Bean 都将被延迟初始化,除非在 Bean 定义中另有指定。

//指定bean不进行延迟加载
@Lazy(false)
@Component
public class EagerService {

    public EagerService() {
        System.out.println("EagerService initialized eagerly");
    }
}

三,局部延迟加载

如果你只想对特定的 Bean 进行延迟加载,可以在这些 Bean 上使用 @Lazy 注解。@Lazy 注解可以应用在类级别或方法级别。

2.1 在类级别使用 @Lazy

@Lazy
@Component
public class MyLazyService {

    public MyLazyService() {
        System.out.println("MyLazyService initialized");
    }
}

2.2 在方法级别使用 @Lazy

@Configuration
public class MyConfig {

    @Bean
    @Lazy
    public MyLazyService myLazyService() {
        return new MyLazyService();
    }
}

class MyLazyService {
    public MyLazyService() {
        System.out.println("MyLazyService initialized");
    }
}

四,延迟注入

除了延迟初始化 Bean,本身,你还可以通过 @Lazy 注解延迟注入。这对于某些情况下避免循环依赖或减少不必要的初始化开销非常有用。

  • 在字段或构造函数注入中使用 @Lazy

    @Component
    public class MyService {
    
        private final MyLazyService myLazyService;
    
        @Autowired
        public MyService(@Lazy MyLazyService myLazyService) {
            this.myLazyService = myLazyService;
        }
    
        public void useLazyService() {
            System.out.println("Using MyLazyService...");
            myLazyService.doSomething();
        }
    }
    
    @Component
    class MyLazyService {
    
        public MyLazyService() {
            System.out.println("MyLazyService initialized");
        }
    
        public void doSomething() {
            System.out.println("Doing something...");
        }
    }
    

在这个示例中,MyLazyService 将在 useLazyService() 方法被调用时才会初始化。

posted @ 2024-08-09 09:20  wdadwa  阅读(283)  评论(0)    收藏  举报