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 属性,以达到优化资源利用和提升应用性能的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905281.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面试经典 150 题.P27. 移除元素(002)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeElement(int[] nums, int…

新160个crackme - 088-[KFC]fish‘s CrackMe

运行分析 需破解用户名和RegKey PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida函数窗口逐个查看&#xff0c;找到关键函数sub_401440 ida无法动调&#xff0c;需使用OD&#xff0c;启用StrongOD插件才可以动调ida静态分析&#xff0c;逻辑如下&…

[Linux关键词]unmask,mv,dev/pts,stdin stdout stderr,echo

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

你知道你的顾客长什么样儿吗 | 顾客画像的魅力

0139岁、亚裔、女性和 Costco 「一位 39 岁的亚裔女性&#xff0c;年收入可达到 12.5 万美金」&#xff0c;这是 Numerator 描绘的 Costco 2023 年的顾客画像。而一个典型的 Costco 会员每两周的周末会去一次 Costco&#xff08;约为每年前往Costco采买30次&#xff09;&…

报表制作神器,轻松应对复杂报表

在企业运营中&#xff0c;面对海量数据和复杂报表的处理&#xff0c;不少公司都希望能有一款便捷、高效的工具来帮忙完成各类报表任务。今天要给大家推荐的是一款备受用户好评的国产报表工具——山海鲸报表&#xff0c;它不仅能处理复杂的数据表&#xff0c;还拥有丰富的可视化…

auto 项目笔记

基础设置 1.设置python目录为根路径 1. merge_with_history debug (1) coomon.yaml 修改 最下边的 root: /mnt/sdb/daimler/EHPV2/Ruiming_InternalDaily (2) 环境变量设置为1时 不走此步骤做的任何处理&#xff0c;直把上步数据接透传出去 2.

亚马逊云免费Amazon CloudFront服务

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 引言一、亚马逊云科技简介二、亚马逊云科技免费资源注册信息准备注册亚马逊云科技账号 三、…

企业应该采用和支持网络安全的几个实践

令人惊讶的是&#xff0c;网络安全可以像遵循最佳实践一样简单&#xff0c;理想情况下应该将其融入企业文化本身。在这篇文章中了解更多。 网络安全的重要性 在当今的网络安全期望中&#xff0c;软件工程师应该优先考虑他们的计算机系统和内部IT网络的安全性。我认为严重依赖…

升降压斩波【电力电子技术5章】

降压斩波&#xff1a; 升压斩波&#xff1a; 升降压斩波&#xff1a;

细说 ThreadPool(线程池)使用与优势以及实现方式

细说 ThreadPool&#xff08;线程池&#xff09;使用与优势https://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247485102&idx1&sndc578203c855e479a5b678b99b0f46b6&chksmc266aabbf51123ade562bf61230c3665886ae6c38fec790d2d9fb83afa805a1402d81086263c#r…

一种将树莓派打造为游戏机的方法——Lakka

什么是Lakka&#xff1f; Lakka是一款Linux发行版&#xff0c;轻量级的&#xff0c;可将小型计算机转变为一台复古游戏机。 图1-Lakka官网&#xff0c;见参考链接[1] Lakka是RetroArch和libretro生态系统下的官方操作系统&#xff0c;前者RetroArch是模拟器、游戏引擎和媒体播…

中医知识图谱之可视化模糊查询+力导向图+环形图的布局切换

后端通过springboot链接neo4j实现 前端通过echarts的关系图组件实现&#xff0c;echarts版本是4.2.1(有点老的版本但是不影响&#xff09; 实现功能是模糊查询中药方剂和药材的关系图谱 1 知识图谱可视化 黄色标识药方方剂、蓝色是药材&#xff0c;支持切换布局、支持模糊搜索…

【春秋云镜】CVE-2023-27179

CVE-2023-27179 CVE-2023-27179 是一个影响 Apache Doris 的漏洞。Apache Doris 是一款用于交互式分析的高性能数据库&#xff0c;特别适用于处理大规模的结构化数据。该漏洞属于权限提升漏洞&#xff0c;允许未授权用户以管理员身份执行敏感操作。 具体细节 漏洞类型&#…

Mybatis使用和原理

Mybatis使用和原理 1、ORM架构2、Spring整合MyBatis使用2.1 添加maven依赖2.2 配置数据源2.3 创建实体类2.4 创建 MyBatis Mapper2.4.1 使用MyBatis注解2.4.2 使用XML方式 2.5 Service 层 3、Spring整合Hibernate使用3.1 添加maven依赖3.2 配置数据源3.3 创建实体类3.4 创建 Re…

C/C++ 矩阵的QR分解

#include <iostream> #include <vector> using namespace std;int main() /* 矩阵A的QR分解*/ {// 动态分配内存int m 3; // 行数int n 3; // 列数// 初始化矩阵Adouble A[3][3] {{1, 2, 2},{2, 1, 2},{1, 2, 1}};double R[3][3] { 0 };double Q[3][3] { 0 };…

Transformer-BiGRU多特征输入时间序列预测(Pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Transformer-BiGRU多特征输入时间序列预测 可以做风电预测&#xff0c;光伏预测&#xff0c;寿命预测&#xff0c;浓度预测等。 Python代码&#xff0c;基于Pytorch编写 1.多特征输入单步预测&#xff0c;多步预测&a…

Unity hub登录时一直无法进入license

直接只卸载unity hub&#xff0c;然后重新下载unity hub安装即可&#xff0c;重新登录即可。 有时会自动关联安装的位置&#xff0c;如果不能&#xff0c;则手动定位添加即可。 网上各种修复的方法操作费时费力。

【MySQL】架构

1. MySQL架构基本理解 与餐厅就餐类比理解 每次数据库查询就像一次餐厅服务 应用程序发出查询相当于点菜MySQL解析和执行查询&#xff0c;后厨根据订单制作食物事务管理保证数据的一致性&#xff0c;类似于结账的时候保证账单正确查询的时候考虑优化器&#xff0c;类似于厨师选…

4款专业音频在线剪辑工具帮你开启创意之路。

音频在线剪辑工具能够为我们提供很大的便利&#xff0c;对于不管是专业的音乐制作人还是音频创作爱好者来说&#xff0c;都能借助一些音频编辑工具来充分发挥自己的创意。所以这一次&#xff0c;我要给大家介绍几个专业方便的音频剪辑工具。 1、福昕音频在线 直达链接&#x…

【热门主题】000015 大数据治理:开启数据价值新纪元

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…