乐趣区

关于java:给你的项目启动提提速Lazy-Initialization

前言

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

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

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

  正当大家纠结不已时,一个编程少侠呈现了。他名叫不一样的科技宅,他通知大家,有一种叫做 ” 提早初始化 ” 的策略,能够帮忙他们解决这个问题。

  据说,提早初始化可能将 bean 的初始化推延到第一次应用时进行,而不是在应用程序启动时立刻初始化。这样一来,只有当某个 bean 真正被须要时,才会进行初始化,防止了不必要的资源耗费和工夫开销。

是什么?

  提早初始化(Lazy Initialization)是一种在须要时才创立或加载对象的策略,以缩小启动工夫和资源耗费。在 Spring 中,提早初始化容许将 Bean 的创立推延到第一次拜访该 Bean 时才进行,而不是在应用程序启动时立刻创立。

有啥用?

节俭资源

  当应用程序中存在大量的 bean 时,立刻初始化所有 bean 可能会占用大量的内存和解决工夫。通过提早初始化,只有在须要应用 bean 时才会进行初始化,能够防止不必要的资源耗费。

放慢启动工夫

  提早初始化能够缩小应用程序启动工夫,因为只有在须要时才会加载和初始化 bean。对于那些在应用程序启动时可能不会应用的较大或简单的 bean,提早初始化能够显著放慢启动工夫。

解决循环依赖

  Spring 容器能够治理 bean 之间的依赖关系。当存在循环依赖时,提早初始化能够帮忙解决这个问题。通过提早初始化,Spring 容器能够在运行时一一解析和满足 bean 之间的依赖,而不是在初始化阶段发现无奈解决的循环依赖。

如何实现?

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 注解的应用

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

依赖关系的解决

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

提早初始化带来的影响

  懒加载尽管能够进步利用的启动性能,但也会带来一些影响。因为 Bean 的初始化被提早到第一次应用,因而在初始化时可能会呈现较长的提早,对于须要立刻应用的 Bean 可能会造成肯定的等待时间。

内存耗费的管制

  懒加载尽管能够缩小利用启动时的内存耗费,但也须要留神对内存的管制。如果利用中存在大量的懒加载 Bean,并且这些 Bean 在理论应用中并不频繁,可能会导致过多的内存占用。因而,须要依据利用的具体情况,正当应用懒加载,防止适度耗费内存。

运行时异样的解决

  因为懒加载将 Bean 的初始化提早到运行时,因而在初始化过程中可能会产生异样。要确保适当地解决这些异样,以避免利用的解体或不可意料的行为。

总结

  懒加载是一种提早加载的技术,用于在须要时才加载资源,而不是在利用启动时加载所有资源。在 Spring Boot 框架中,有两种形式能够实现懒加载:Spring 懒加载和全局懒加载。无论是懒加载还是全局懒加载,它们都能晋升利用的性能和效率,防止不必要的资源加载。

  在应用 Spring 懒加载须要留神正确的注解应用、解决依赖关系、提早初始化带来的影响、内存耗费管制和异样解决等方面。正当地应用能够进步利用性能,但也须要综合思考利用的需要和场景,以确保有效性和稳定性。

结尾

  如果感觉对你有帮忙,能够多多评论,多多点赞哦,也能够到我的主页看看,说不定有你喜爱的文章,也能够顺手点个关注哦,谢谢。

  我是不一样的科技宅,每天提高一点点,体验不一样的生存。咱们下期见!

退出移动版