知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 中的惰性初始化

Spring Boot
HongKong
4
01:22 PM · Dec 06 ,2025

1. 概述

在本教程中,我們將學習如何在應用程序級別配置惰性初始化,從 Spring Boot 2.2 開始。

2. 延遲初始化

默認情況下,在 Spring 中,所有定義的 Bean 以及它們的依賴項會在應用程序上下文創建時創建。

<b多虧,當我們配置一個具有延遲初始化的 Bean 時,它只會創建,並且它的依賴項會在需要時才注入。

3. Maven 依賴

為了將 Spring Boot 集成到我們的應用程序中,我們需要將其包含在 classpath 中。

使用 Maven,我們可以添加 <a href="https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter">spring-boot-starter</a> 依賴:

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

4. 啓用延遲初始化

Spring Boot 2 引入了 <em style="font-style: italic;">spring.main.lazy-initialization</em> 屬性,從而簡化了在整個應用程序中配置延遲初始化的過程。

property value 設置為 true,意味着應用程序中的所有 Bean 都將使用延遲初始化。

讓我們在我們的 application.yml 配置文件中配置該屬性:

spring:
  main:
    lazy-initialization: true

或者,如果情況是這樣的,在我們的 application.properties 文件中:

spring.main.lazy-initialization=true

此配置會影響上下文中的所有 Bean。因此,如果我們想要為特定 Bean 配置惰性初始化,可以使用 @Lazy 方式。

更進一步,我們可以結合使用新的屬性,與 @Lazy 註解一起設置成 false

或者換句話説,所有定義的 Bean 都將使用惰性初始化,除非我們明確地使用 @Lazy(false) 配置它們。

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 方法來配置我們的應用程序以惰性初始化。

請記住,應用程序屬性文件中定義的屬性優先於使用 SpringApplicationSpringApplicationBuilder 設置的標誌

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. 懶加載的影響

啓用整個應用程序的懶加載可能會產生積極和消極的影響。

讓我們討論一下這些影響,正如在有關新功能的官方公告中所描述的 所描述的

  1. 懶加載可能會減少應用程序啓動時創建的 Bean 數量——因此,我們可以提高應用程序的啓動時間
  2. 由於 Bean 在需要時才創建,我們可以掩蓋在運行時出現的問題,而不是在啓動時出現
  3. 這些問題可能包括內存不足錯誤、配置錯誤或類定義未找到錯誤
  4. 在 Web 環境中,按需創建 Bean 會增加 HTTP 請求的延遲——Bean 的創建只會影響第一個請求,但這可能會對負載均衡和自動擴展產生負面影響

7. 結論

在本教程中,我們配置了惰性初始化,使用了 Spring Boot 2.2 中引入的新屬性 spring.main.lazy-initialization

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.