当前位置: 首页 > article >正文

Spring中lazy-init属性

Spring中lazy-init属性

1. 在 Spring 框架中的 lazy-init 属性

在 Spring 框架中,lazy-init 属性主要用于控制 Spring 容器中 Bean 的初始化时机。

含义: 当一个 Bean 被定义在 Spring 的配置文件(可以是 XML 配置或者基于注解的配置等效场景)中时,通过设置 lazy-init 属性,可以指定这个 Bean 是在 Spring 容器启动时就立即初始化,还是等到第一次被使用时才进行初始化。

取值及作用

  • false(默认值,在某些早期版本中可能是 true,但现在普遍默认 false:当 lazy-init="false" 时,意味着在 Spring 容器启动过程中,一旦解析到该 Bean 的定义,就会立即对其进行初始化操作。初始化操作包括创建 Bean 的实例、执行依赖注入(如果有)、调用初始化方法(如果配置了)等一系列步骤。例如,对于一个数据库连接池的 Bean,如果设置为 false,那么在容器启动时就会提前创建好连接池实例,准备好供后续业务使用。

  • true:若 lazy-init="true",则该 Bean 不会在 Spring 容器启动时初始化。而是等到应用程序中第一次真正需要使用这个 Bean 时,Spring 容器才会对其进行初始化操作。比如,有一个用于处理特定业务逻辑且使用频率不高的 Bean,设置为 lazy-init="true" 后,就可以节省容器启动时不必要的资源消耗和初始化时间,只有当该业务逻辑真正被触发需要这个 Bean 时,它才会被初始化并投入使用。

2. 代码控制
基于 XML 配置方式

在传统的 XML 配置文件中,可以在<bean>元素里设置lazy-init属性来控制 Bean 的初始化时机。

示例如下:

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.springframework.org/schema/xsi"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsi">
 ​
     <!-- 定义一个普通的Bean,设置为立即初始化(默认情况) -->
     <bean id="normalBean" class="com.example.demo.NormalBean">
         <!-- 这里可以设置其他属性和依赖注入等 -->
     </bean>
 ​
     <!-- 定义一个延迟初始化的Bean -->
     <bean id="lazyInitBean" class="com.example.demo.LazyInitBean" lazy-init="true">
         <!-- 同样可以设置其他属性和依赖注入等 -->
     </bean>
 ​
 </beans>

在上述示例中:

  • normalBean 没有显式设置 lazy-init 属性,所以它会按照默认情况(在 Spring 版本较新时默认值为 false,即立即初始化)在 Spring 容器启动时就进行初始化。

  • lazyInitBean 则通过设置 lazy-init="true",会在容器启动时不进行初始化,而是等到第一次被使用时才进行初始化。

基于注解配置方式

Spring 也提供了注解来实现类似的功能,常用的注解有 @Component@Service@Repository@Controller 等,这些注解用于标识不同类型的组件(类),可以结合 @Lazy 注解来控制 lazy-init 属性。

示例如下:

 package com.example.demo;
 ​
 import org.springframework.context.annotation.Component;
 import org.springframework.context.annotation.Lazy;
 ​
 // 这是一个普通的组件类,默认会在容器启动时初始化
 @Component
 public class NormalComponent {
     // 类的内部实现
 }
 ​
 // 这是一个延迟初始化的组件类
 @Component
 @Lazy(true)
 public class LazyComponent {
     // 类的内部实现
 }

在上述示例中:

  • NormalComponent 类只使用了 @Component 注解,它会按照默认情况(类似于 XML 配置中的默认 lazy-init="false")在容器启动时就被初始化。

  • LazyComponent 类除了使用 @Component 注解标识自己是一个组件外,还使用了 @Lazy(true) 注解,这就相当于设置了 lazy-init="true",使得该类在 Spring 容器启动时不会被初始化,而是等到第一次被使用时才进行初始化。

另外,如果是在 Spring Boot 项目中,很多时候会使用 @SpringBootApplication 启动类注解来自动扫描组件。上述的基于注解的配置方式同样适用,只要在需要延迟初始化的类上添加相应的注解即可。

基于 Java 配置类方式

除了 XML 和注解配置外,还可以通过 Java 配置类来设置 lazy-init 属性。

首先创建一个 Java 配置类:

 package com.example.demo;
 ​
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
 ​
 @Configuration
 public class AppConfig {
 ​
     // 定义一个立即初始化的Bean
     @Bean
     public NormalBean normalBean() {
         return new NormalBean();
     }
 ​
     // 定义一个延迟初始化的Bean
     @Bean
     @Lazy(true)
     public LazyBean lazyBean() {
         return new LazyBean();
     }
 }

在上述示例中:

  • normalBean() 方法定义了一个普通的 Bean,它会按照默认情况(类似于 XML 配置中的默认 lazy-init="false")在容器启动时就被初始化。

  • lazyBean() 方法定义了一个延迟初始化的 Bean,通过添加 @Lazy(true) 注解,相当于设置了 lazy-init="true",使得该 Bean 在容器启动时不会被初始化,而是等到第一次被使用时才进行初始化。

通过以上几种方式,就可以在 Spring 框架中根据具体需求在代码中灵活控制 lazy-init 属性,以达到优化资源利用和提升应用性能的目的。


http://www.kler.cn/a/379335.html

相关文章:

  • 『YOLO』| 断点训练、解决训练中断异常情况
  • SpringBoot新闻稿件管理系统:架构与实现
  • Python并发编程库:Asyncio的异步编程实战
  • 数据结构之线段树
  • Python小游戏19——滑雪小游戏
  • 蓝桥双周赛 第21场 小白入门赛
  • 大模型日报|10 篇必读的大模型论文
  • 【eNSP】企业网络架构实验
  • 监听el-table中 自定义封装的某个组件的值发现改变调用函数
  • P11118 [ROI 2024 Day 2] 无人机比赛 题解
  • 代码随想录算法训练营第十七天|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
  • 木马病毒相关知识
  • 什么是 Pump.fun?
  • 代码随想录day20 二叉树(七)
  • ==,===,Object.is的区别
  • 春日启航:海滨学院班级记忆的数字化之旅
  • shell脚本案例:创建用户和组
  • SpringBoot抗疫物资管理系统:技术架构解析
  • 使用 async/await 时未捕获异常的问题及解决方案
  • spark集群模式-standalone的配置和使用
  • EJEAS S2滑雪对讲机全球发布会圆满举办,为滑雪市场注入新活力
  • 在Ubuntu上安装TensorFlow与Keras
  • Golang | Leetcode Golang题解之523题连续的子数组和
  • WPF中如何简单的使用MvvmLight创建一个项目并进行 增删改查
  • 【屏幕驱动移植记录】
  • C#如何封装将函数封装为接口dll?