Spring Boot 2中的延迟初始化

1.概述

Spring Boot 2.2开始在应用程序级别配置延迟初始化。

2.延迟初始化

在Spring中,默认情况下,所有定义的bean及其依赖项都是在创建应用程序上下文时创建的。

相反,当使用延迟初始化配置bean时,仅在需要bean时才创建该bean,并注入其依赖项。

3.Maven依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.4.3</version>
    </dependency>
</dependencies>

4.启用延迟初始化

Spring Boot 2引入了spring.main.lazy-initialization属性,使在整个应用程序中配置延迟初始化变得更加容易。

将属性值设置为true意味着应用程序中的所有bean将使用延迟初始化。

在application.yml配置文件中配置属性:

spring:
  main:
    lazy-initialization: true

或者,在application.properties文件中:

spring.main.lazy-initialization=true

此配置影响上下文中的所有bean。 如果想为特定bean配置延迟初始化,可以通过@Lazy方法来完成。

更进一步,可以将new属性与@Lazy批注结合使用,设置为false。

换句话说,除了使用@Lazy(false)显式配置的那些bean外,所有定义的bean都将使用延迟初始化。

4.1.使用SpringApplicationBuilder

配置延迟初始化的另一种方法是使用SpringApplicationBuilder方法:

SpringApplicationBuilder(Application.class)
  .lazyInitialization(true)
  .build(args)
  .run();

在上面的示例中,使用lazyInitialization方法来控制是否应延迟初始化应用程序。

4.2. 使用SpringApplication

另外,也可以使用SpringApplication类:

SpringApplication app = new SpringApplication(Application.class);
app.setLazyInitialization(true);
app.run(args);

在这里,使用setLazyInitialization方法将应用程序配置为延迟初始化。

要记住的一个重要注意事项是,在应用程序属性文件中定义的属性优先于使用SpringApplication或SpringApplicationBuilder设置的标志。

5. 运行

通过向构造函数添加一条消息,将确切地知道何时创建bean。

public class Writer {

    private final String writerId;

    public Writer(String writerId) {
        this.writerId = writerId;
        System.out.println(writerId + " initialized!!!");
    }

    public void write(String message) {
        System.out.println(writerId + ": " + message);
    }
    
}

另外,创建SpringApplication并注入之前创建的服务。

@SpringBootApplication
public class Application {

    @Bean("writer1")
    public Writer getWriter1() {
        return new Writer("Writer 1");
    }

    @Bean("writer2")
    public Writer getWriter2() {
        return new Writer("Writer 2");
    }

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        System.out.println("Application context initialized!!!");

        Writer writer1 = ctx.getBean("writer1", Writer.class);
        writer1.write("First message");

        Writer writer2 = ctx.getBean("writer2", Writer.class);
        writer2.write("Second message");
    }
}

将spring.main.lazy-initialization属性值设置为false,然后运行应用程序。

Writer 1 initialized!!!
Writer 2 initialized!!!
Application context initialized!!!
Writer 1: First message
Writer 2: Second message

正如上面所说,bean是在应用程序上下文启动时创建的。

现在,将spring.main.lazy-initialization的值更改为true,然后再次运行应用程序。

Application context initialized!!!
Writer 1 initialized!!!
Writer 1: First message
Writer 2 initialized!!!
Writer 2: Second message

结果,该应用程序没有在启动时创建bean,而是仅在需要它们时才创建。

6.延迟初始化的影响

在整个应用程序中启用延迟初始化可能会产生积极和消极的影响。

  • 延迟初始化可能会减少应用程序启动时创建的bean的数量–因此,我们可以缩短应用程序的启动时间

  • 由于在需要它们之前都不会创建任何Bean,因此我们可以掩盖问题,使其在运行时而不是启动时运行。

  • 这些问题可能包括内存不足错误,配置错误或发现类定义的错误

  • 另外,当处于Web上下文中时,按需触发Bean创建会增加HTTP请求的延迟-Bean创建只会影响第一个请求,但这可能会对负载平衡和自动缩放产生负面影响。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: org.springframework.boot.logging.deferredlogfactory是Spring Boot框架的一个类,它提供了一种延迟初始化日志记录器的机制。这个类可以帮助开发者在应用程序启动时避免不必要的日志记录,从而提高应用程序的性能和效率。 ### 回答2: org.springframework.boot.logging.deferredlogfactory 是Spring Boot框架的一个组件,它是DeferredLogFactory类的一个实现,是一个延迟加载的日志工厂。它的主要作用是在Spring Boot项目启动过程,写日志的操作可以延迟到实际需要输出日志的时候再去完成,从而避免了在启动阶段输出大量无用的日志信息,减少了日志输出带来的性能损耗。 通常情况下,在Spring Boot应用启动时,日志工厂会在应用的日志输出目录下创建日志文件,并将应用的日志信息持久化到这些日志文件。如果日志信息过多,会导致占用磁盘空间过多,并且对性能也会产生一定的影响。而 DeferredLogFactory 的实现方式则是将日志的输出列表存储到一个队列,等到需要实际输出日志信息的时候再去输出。这样可以减少日志文件持久化对磁盘的占用,并且可以提升应用的性能。 在使用 DeferredLogFactory 时,需要在Spring Boot项目的配置文件(如application.yml)增加如下配置: logging: defer: true 这样就会开启Spring Boot的DeferredLogFactory功能,并实现日志信息的延迟输出。一旦有日志信息需要输出,可以通过调用DeferredLog接口的log方法来输出。由于输出的时机是在需要的时候,所以日志输出顺序可能与消息实际发生的顺序不一致。如果想以消息实际发生的顺序输出日志信息,则需要关闭DeferredLogFactory功能。 ### 回答3: org.springframework.boot.logging.deferredlogfactory是Spring框架的一部分,主要的作用是为日志记录提供支持。它是一个工厂类,可以延迟创建所需的日志实例。这样做可以避免在应用程序启动时,因为创建的日志实例太多,而导致应用程序变慢或浪费资源。 当我们使用org.springframework.boot.logging.deferredlogfactory时,它会提供两种日志记录方式:logback和log4j2。这样,我们就可以根据需要选择适合自己的日志记录方式。 另外,由于DeferredLogFactory是延迟创建日志实例的工厂类,因此它还可以帮助我们在应用程序的生命周期内重构日志记录。比如,我们可以将应用程序的日志记录重构为使用更有效率的日志记录策略,以更好地支持应用程序的需求。 值得注意的是,虽然org.springframework.boot.logging.deferredlogfactory是Spring框架的一部分,但它也可以被用于其他Java应用程序。只需要正确地设置依赖项和配置即可。在使用它时,我们应该遵循Spring框架的最佳实践,以确保最佳的性能和安全性。 综上所述,org.springframework.boot.logging.deferredlogfactory是一个非常有用的工具,可以帮助我们处理日志记录和应用程序性能的问题。它可以提供灵活的日志记录方式,并成功地延迟创建日志实例,避免应用程序在启动时出现资源浪费或性能不佳的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值