Spring Bean的提前加载和懒加载

embedded/2025/1/19 4:28:23/

一、将特定的bean 提前加载来满足其他bean对该bean 的依赖

通过实现 BeanFactoryPostProcessor 该接口重写postProcessBeanFactory() 方法来进行bean的提前加载

在Bean1中加载Bean2 让Bean提前加载。

再写一个Bean3让系统加载(无调用)

项目启动先加载Bean2 再加载Bean3

价值

懒加载

懒加载是Spring框架中的一种机制,用于在需要时才创建Bean,而不是在容器启动时立即创建。特别是在Bean数量较多的情况下,可以减少启动时的时间和内存消耗。

配置方式:

1.XML配置

在XML文件中,可以通过设置lazy-init="true"来启用懒加载。

<bean id="cart" class="cn.tedu.beans.Cart" lazy-init="true"></bean>

为全局配置懒加载:

<beans default-lazy-init="true">
<bean id="cart" class="cn.tedu.beans.Cart"></bean>
</beans>

2.注解配置

在实际开发中,注解方式更为常用。可以使用@Lazy注解来启用懒加载。

@Lazy
@Component
public class Book {
public Book() {
System.out.println("调用构造方法,创建book...");
}
}

在配置类中也可以使用@Lazy注解:

@Configuration
public class Config {
@Lazy
@Bean
public Book getBook() {
return new Book();
}
}

原理:

Spring在扫描加载Bean时,会读取@Lazy和@Component注解的相应值,并设置Bean定义的lazyInit属性。读取注解配置时最终会调用ClassPathBeanDefinitionScanner及其子类实现的doScan方法。

在Spring框架刷新时,会初始化非延迟加载的单例Bean。具体实现是在AbstractApplicationContext类的refresh方法中调用finishBeanFactoryInitialization方法。

注意:

  1. 非延迟加载的类中不能自动注入延迟加载的类,否则会导致延迟加载失效。例如,如果一个Controller类不是延迟加载的,但其中使用了@Autowired注解注入了一个延迟加载的Service类,那么在程序初始化时,Controller会被初始化,同时Service也会被初始化,从而导致懒加载失效。

  2. 如果想要实现某个类的延迟加载,需要确保调用链前都不存在非延迟加载类,否则延迟加载会失效。


http://www.ppmy.cn/embedded/155138.html

相关文章

Vue.js组件开发-如何实现表头搜索

在Vue.js组件开发中&#xff0c;实现表头搜索通常涉及在表格组件的表头添加输入框&#xff0c;并让用户能够输入搜索关键字来过滤表格数据。 以下是一个使用Element UI的el-table组件实现表头搜索的示例&#xff1a; 一、准备阶段 ‌确保Element UI已安装‌&#xff1a; 确保…

Spring Boot与MyBatis

Spring Boot与MyBatis的配置 一、简介 Spring Boot是一个用于创建独立的、基于Spring的生产级应用程序的框架&#xff0c;它简化了Spring应用的初始搭建以及开发过程。MyBatis是一款优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。将Spring Boot和MyBa…

2025年01月蓝桥杯Scratch1月stema选拔赛真题—美丽的图形

美丽的图形 编程实现美丽的图形具体要求: 1)点击绿旗&#xff0c;角色在舞台中心&#xff0c;如图所示&#xff1b; 2)1秒后&#xff0c;绘制一个边长为 140的红色大正方形&#xff0c;线条粗细为 3&#xff0c;正方形的中心为舞台中心&#xff0c;如图所示; 完整题目可点击下…

大模型(LLM)的若干科普之问(五):调用LLM涉及哪些参数?

一、一个简单的示例 其实&#xff0c;调LLM并不复杂&#xff0c;看一个例子&#xff1a; 以下是一个使用 OpenAI API 的 Python 程序示例&#xff0c;它可以将一段文本进行修改和完善。程序会调用 GPT 模型对输入文本进行润色&#xff0c;使其更加流畅、清晰或符合特定风格。 …

ASP.NET Core - 依赖注入(三)

ASP.NET Core - 依赖注入&#xff08;三&#xff09; 4. 容器中的服务创建与释放 4. 容器中的服务创建与释放 我们使用了 IoC 容器之后&#xff0c;服务实例的创建和销毁的工作就交给了容器去处理&#xff0c;前面也讲到了服务的生命周期&#xff0c;那三种生命周期中对象的创…

C++实现设计模式--- 观察者模式 (Observer)

观察者模式 (Observer) 观察者模式 是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生改变时&#xff0c;其依赖者&#xff08;观察者&#xff09;会收到通知并自动更新。 意图 定义对象之间的一对多依赖关系。当一个对象状…

PyTorch DAY2: 搭建神经网络

如今&#xff0c;我们已经了解了 PyTorch 中张量及其运算&#xff0c;但这远远不够。本次实验将学会如何使用 PyTorch 方便地构建神经网络模型&#xff0c;以及 PyTorch 训练神经网络的步骤及方法。 知识点 PyTorch 构建神经网络Sequential 容器结构使用 GPU 加速训练模型保存…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1&#xff0c;ZGC&#xff08;JDK21之前&#xff09; ZGC 的核心是一个并发垃圾收集器&#xff0c;所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节&#xff08;TB&#xff09;级内存&#xff0c;设计了基…