Spring Boot2 中的懒加载

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

但是,当我们使用延迟初始化配置bean时,只会创建bean,并在需要时注入其依赖项。

启用全局延迟初始化

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

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

在我们的application.properties文件中配置:

spring.main.lazy-initialization=true

此配置会影响上下文中的所有bean。而如果我们想为特定bean配置延迟初始化,我们可以通过@Lazy注解来实现。

更重要的是,我们可以将new属性与@Lazy注解结合使用,设置为false。

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

示例

让我们创建一个简单的服务,使我们能够测试刚刚描述的内容。

通过向构造函数添加打印消息,我们将确切知道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,而只在需要它们时才创建bean。

延迟初始化的影响

在整个应用程序中启用延迟初始化可能会产生正面和负面影响:

  1. 延迟初始化可能会减少应用程序启动时创建的bean数量 - 因此,我们可以缩短应用程序的启动时间;
  2. 由于在需要之前没有创建任何bean,我们可以屏蔽问题,使它们在运行时报错而不是在启动时;
  3. 可能会出现内存不足错误,配置错误或发现类定义错误;
  4. 此外,当我们处于Web上下文时,按需触发bean创建会增加HTTP请求的延迟 - bean创建只会影响第一个请求,但这可能会对负载平衡和自动扩展产生负面影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peterwanghao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值