Spring Boot 中的延迟初始化

x33g5p2x  于2021-10-16 转载在 Spring  
字(3.0k)|赞(0)|评价(0)|浏览(631)

在本文中,我们将看到如何在 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

演示

为了看看它是如何工作的,让我们创建两个服务类,即 ServiceXServiceY,如下所示:
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();
}

使用延迟初始化的优缺点

在应用程序中使用延迟初始化有很多优点和缺点。

  1. 启用延迟初始化可以减少应用程序启动所需的时间。
  2. 找不到bean,配置错误导致NoClassDefFoundError,OutOfMemoryError异常。
    1.它可以延迟发现应用程序的问题。如果配置错误的 bean 被延迟初始化。
    1、开启延迟初始化会导致很多web相关的bean直到收到HTTP请求才被初始化。

结论

我们可以说使用延迟初始化减少了启动时间,在需要时注入所需的 bean,并且在与 Spring Boot 的开发工具一起使用时它提高了生产力。此外,它在进行集成测试时很有用,因为它可以减少测试执行时间,同时在开发过程中单独运行测试用例。

相关文章

微信公众号

最新文章

更多