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 方法來配置我們的應用程序以惰性初始化。
請記住,應用程序屬性文件中定義的屬性優先於使用 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 的創建只會影響第一個請求,但這可能會對負載均衡和自動擴展產生負面影響。
7. 結論
在本教程中,我們配置了惰性初始化,使用了 Spring Boot 2.2 中引入的新屬性 spring.main.lazy-initialization。