在本文中,我们将看到如何在 Spring Boot 应用程序中配置延迟初始化。 Spring Boot 2.2 引入了对 懒惰初始化 的支持,并通过引入新属性(即 spring.main.lazy-initialization
)使其更容易。当它设置为 true
时,应用程序中的 bean 定义将被配置为使用延迟初始化。默认设置为 false
。
默认情况下,在 Spring 中,每当刷新应用程序上下文时,都会创建所有 bean 并注入其依赖项。在某些情况下,我们需要在需要时进行这种初始化,对于这些类型的场景,Spring Boot 2.2 提供了一个新属性,可以在我们需要时延迟和延迟注入依赖项。
要启用延迟初始化,项目类路径中必须有 Spring Boot 2.2 或更高版本的 starter 依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
可以通过设置 Spring Boot 项目的 application.properties 文件中的属性 spring.main.lazy-initialization=*true*
来启用延迟初始化。
application.properties
spring.main.lazy-initialization=true
或者在 application.yaml 的情况下,它也可以配置为:
application.yaml
spring:
main:
lazy-initialization: true
为了看看它是如何工作的,让我们创建两个服务类,即 ServiceX
和 ServiceY
,如下所示:
ServiceX.java
package org.websparrow.service;
public class ServiceX {
public ServiceX() {
System.out.println("ServiceX initialized!");
}
public void printSomething() {
System.out.println("ServiceX : printing something...");
}
}
ServiceY.java
package org.websparrow.service;
public class ServiceY {
public ServiceY() {
System.out.println("ServiceY initialized!");
}
public void printSomething() {
System.out.println("ServiceY : printing something...");
}
}
另外,让我们创建 SpringBootLazyInitializationApp
并注入我们之前创建的服务。
SpringBootLazyInitializationApp.java
package org.websparrow;
import org.springframework.*;
import org.websparrow.service.*;
@SpringBootApplication
public class SpringBootLazyInitializationApp {
@Bean("serviceX")
public ServiceX getServiceX() {
return new ServiceX();
}
@Bean("serviceY")
public ServiceY getServiceY() {
return new ServiceY();
}
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication
.run(SpringBootLazyInitializationApp.class, args);
System.out.println("Application context initialized!!!");
ServiceX serviceX = applicationContext.getBean("serviceX", ServiceX.class);
serviceX.printSomething();
ServiceY serviceY = applicationContext.getBean("serviceY", ServiceY.class);
serviceY.printSomething();
}
}
现在在 application.properties 文件中设置 spring.main.lazy-initialization=*false*
,然后运行应用程序。
控制台日志
ServiceX initialized!
ServiceY initialized!
Application context initialized!!!
ServiceX : printing something...
ServiceY : printing something...
如您所见,所有 bean 在应用程序启动时创建和注入。
让我们在 application.properties 文件中设置 spring.main.lazy-initialization=*true*
,然后再次运行该应用程序。
控制台日志
Application context initialized!!!
ServiceX initialized!
ServiceX : printing something...
ServiceY initialized!
ServiceY : printing something...
如果比较这两个结果,您会发现应用程序没有在启动时创建 bean,而是仅在需要它们时才创建。
注意: 如果您想在对应用程序的其余部分使用延迟初始化的同时禁用某些 bean 的延迟初始化,您可以使用 @Lazy(*false*)
注释将它们的延迟属性显式设置为 false。
@Bean("serviceX")
@Lazy(false)
public ServiceX getServiceX() {
return new ServiceX();
}
在应用程序中使用延迟初始化有很多优点和缺点。
NoClassDefFoundError
,OutOfMemoryError
异常。我们可以说使用延迟初始化减少了启动时间,在需要时注入所需的 bean,并且在与 Spring Boot 的开发工具一起使用时它提高了生产力。此外,它在进行集成测试时很有用,因为它可以减少测试执行时间,同时在开发过程中单独运行测试用例。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.websparrow.org/spring/lazy-initialization-in-spring-boot
内容来源于网络,如有侵权,请联系作者删除!