likes
comments
collection
share

给你的项目启动提提速:Lazy Initialization

作者站长头像
站长
· 阅读数 10

给你的项目启动提提速:Lazy Initialization

前言

  在一个名为种花家的小镇上,生活着一群热爱编程的人。他们致力于构建出高效、可维护的软件系统,而 Spring Boot 框架成为了他们的不二之选。这个小镇上的人们每天都在用 Spring Boot 框架创造着令人瞩目的应用程序。

  然而,随着时间的推移,他们的应用程序变得越来越庞大,包含了许多不同的模块和组件。在应用程序启动的时候,所有的 bean 都会被一次性初始化,这导致了一个令人头疼的问题:启动时间变得越来越长了。

  小镇的居民们开始感到困扰。他们意识到,无论是在开发环境还是在生产环境中,启动时间的长短都直接关系到他们的工作效率和用户体验。于是,他们寻找一种解决方案,希望能够在保证应用程序正常运行的同时,减少启动时间的开销。

  正当大家纠结不已时,一个编程少侠出现了。他名叫不一样的科技宅,他告诉大家,有一种叫做"延迟初始化"的策略,可以帮助他们解决这个问题。

  据说,延迟初始化能够将 bean 的初始化推迟到第一次使用时进行,而不是在应用程序启动时立即初始化。这样一来,只有当某个 bean 真正被需要时,才会进行初始化,避免了不必要的资源消耗和时间开销。

是什么?

  延迟初始化(Lazy Initialization)是一种在需要时才创建或加载对象的策略,以减少启动时间和资源消耗。在 Spring 中,延迟初始化允许将 Bean 的创建推迟到第一次访问该 Bean 时才进行,而不是在应用程序启动时立即创建。

给你的项目启动提提速:Lazy Initialization

有啥用?

节省资源

  当应用程序中存在大量的 bean 时,立即初始化所有 bean 可能会占用大量的内存和处理时间。通过延迟初始化,只有在需要使用 bean 时才会进行初始化,可以避免不必要的资源消耗。

加快启动时间

  延迟初始化可以减少应用程序启动时间,因为只有在需要时才会加载和初始化 bean。对于那些在应用程序启动时可能不会使用的较大或复杂的 bean,延迟初始化可以显著加快启动时间。

解决循环依赖

  Spring 容器可以管理 bean 之间的依赖关系。当存在循环依赖时,延迟初始化可以帮助解决这个问题。通过延迟初始化,Spring 容器可以在运行时逐个解析和满足 bean 之间的依赖,而不是在初始化阶段发现无法解决的循环依赖。

给你的项目启动提提速:Lazy Initialization

如何实现?

Spring Boot 中实现延迟初始化 Bean,可以采取以下四种方法:

  1. 对于使用注解配置的 Bean,可以在 Bean 的定义上使用 @Lazy 注解来实现延迟初始化。

示例:

@Lazy
@Component
public class MyBean {
    // Bean 的定义
}
  1. 对于使用 Java 配置类的方式,可以在 @Bean 注解上使用 @Lazy 注解,以实现延迟初始化。

示例:

@Configuration
public class AppConfig {
    @Lazy
    @Bean
    public MyBean myBean() {
        // Bean 的定义
        return new MyBean();
    }
}
  1. 对于 XML 配置的 Bean,可以在 <bean> 元素上设置 lazy-init 属性为 true,以实现延迟初始化。

示例:

<bean id="myBean" class="com.example.MyBean" lazy-init="true" />
  1. 对于使用@ComponentScan注解,可以配置属性lazyInit = true 实现某些包下面所有的 bean 延迟初始化。

示例:

package com.example.demo.bean;

import org.springframework.stereotype.Component;

@Component
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }
}

@SpringBootApplication
@ComponentScan(value = "com.example.demo.bean", lazyInit = true)
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

全局懒加载

  上面演示案例,意味着我们只能对自己实现的 bean 进配置。但是项目中肯定会引入很多第三方的 starter,比如 redis,mq。如果想对引入的第三方库进行配置,那就不太容易了,所以我们可以开启全局懒加载。

配置文件增加下面的配置:

spring:
  main:
    lazy-initialization: true  #默认false 关闭

开启了全局懒加载,想要过滤某个 bean,可以通过设置 @Lazy(false) 排除。

@Component
@Lazy(false)
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }
}

还有一种是通过配置 LazyInitializationExcludeFilter 规则实现排除。

@Configuration
public class AppConfig {

    @Bean
    LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() {
        return LazyInitializationExcludeFilter.forBeanTypes(MyBean.class);
    }
}

给你的项目启动提提速:Lazy Initialization

注意的点

@Lazy 注解的使用

  要确保在正确的位置使用@Lazy 注解。通常情况下,将其添加在 Bean 的定义上,例如@Component、@Service、@Repository 等注解上。这样可以确保被标记的 Bean 在第一次使用时才会进行初始化。

依赖关系的处理

  懒加载的 Bean 可能会被其他 Bean 所依赖。在处理依赖关系时,要确保依赖的 Bean 已经被初始化或者也进行了懒加载。否则,可能会导致依赖注入失败或出现异常。

延迟初始化带来的影响

  懒加载虽然可以提高应用的启动性能,但也会带来一些影响。由于 Bean 的初始化被延迟到第一次使用,因此在初始化时可能会出现较长的延迟,对于需要立即使用的 Bean 可能会造成一定的等待时间。

内存消耗的控制

  懒加载虽然可以减少应用启动时的内存消耗,但也需要注意对内存的控制。如果应用中存在大量的懒加载 Bean,并且这些 Bean 在实际使用中并不频繁,可能会导致过多的内存占用。因此,需要根据应用的具体情况,合理使用懒加载,避免过度消耗内存。

运行时异常的处理

  由于懒加载将 Bean 的初始化延迟到运行时,因此在初始化过程中可能会发生异常。要确保适当地处理这些异常,以防止应用的崩溃或不可预料的行为。

给你的项目启动提提速:Lazy Initialization

总结

  懒加载是一种延迟加载的技术,用于在需要时才加载资源,而不是在应用启动时加载所有资源。在 Spring Boot 框架中,有两种方式可以实现懒加载:Spring 懒加载和全局懒加载。无论是懒加载还是全局懒加载,它们都能提升应用的性能和效率,避免不必要的资源加载。

  在使用 Spring 懒加载需要注意正确的注解使用、处理依赖关系、延迟初始化带来的影响、内存消耗控制和异常处理等方面。合理地使用可以提高应用性能,但也需要综合考虑应用的需求和场景,以确保有效性和稳定性。

给你的项目启动提提速:Lazy Initialization

结尾

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!