spring.main.lazy-initialization配置的实现机制

spring.main.lazy-initialization 配置的实现机制:

Spring Boot 中 spring.main.lazy-initialization 配置的实现机制

当在 Spring Boot 应用中配置 spring.main.lazy-initialization=true 时,整个懒加载的机制是通过以下类和流程实现的:

1. 核心实现类:LazyInitializationBeanFactoryPostProcessor

LazyInitializationBeanFactoryPostProcessor 是实现全局懒加载的核心类。这个类位于 org.springframework.boot 包下,是一个 BeanFactoryPostProcessor 实现。

2. 工作原理

配置阶段:
  • 当在 application.properties 或 application.yml 中设置 spring.main.lazy-initialization=true 后,SpringApplication 实例的 lazyInitialization 属性会被设置为 true。
注册阶段:
  • 在 SpringApplication.run() 方法中,会调用 prepareContext() 方法
  • 当 this.lazyInitialization 为 true 时,Spring 会向容器注册一个 LazyInitializationBeanFactoryPostProcessor 的实例
执行阶段:
  • 在 Spring 容器的 refresh() 方法中,会调用所有 BeanFactoryPostProcessor 的 postProcessBeanFactory() 方法
  • LazyInitializationBeanFactoryPostProcessor 的 postProcessBeanFactory() 方法会遍历容器中的所有 BeanDefinition

3. 关键代码逻辑

java 复制代码
public final class LazyInitializationBeanFactoryPostProcessor 
    implements BeanFactoryPostProcessor, Ordered {
    
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 
            throws BeansException {
        
        // 遍历所有Bean定义
        for (String beanName : beanFactory.getBeanDefinitionNames()) {
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
            
            // 排除特定类型的Bean(如基础设施Bean)
            if (!isExcluded(beanDefinition, beanName)) {
                // 关键代码:将BeanDefinition的lazyInit属性设置为true
                beanDefinition.setLazyInit(true);
            }
        }
    }
    
    // 检查是否应该排除该Bean(如SmartInitializingSingleton类型等)
    private boolean isExcluded(BeanDefinition beanDefinition, String beanName) {
        // 实现排除逻辑
    }
}

4. 排除条件

根据搜索结果,LazyInitializationBeanFactoryPostProcessor 会排除以下类型的 Bean:

  1. 基础设施角色 Bean:自动从懒加载中排除
  2. SmartInitializingSingleton 类型:这类 Bean 需要立即初始化
  3. 已经显式设置 lazy-init 属性的 Bean:如果已经明确设置了值,则不覆盖

5. 使用方式

配置文件方式:
properties 复制代码
# application.properties
spring.main.lazy-initialization=true
编程方式:
java 复制代码
// 使用 SpringApplicationBuilder
new SpringApplicationBuilder(MyApplication.class)
    .lazyInitialization(true)
    .run(args);

// 使用 SpringApplication
SpringApplication app = new SpringApplication(MyApplication.class);
app.setLazyInitialization(true);
app.run(args);

6. 生效时机

  • 这个处理器会在 Spring 容器的 refresh() 方法中被调用
  • 具体是在调用 finishBeanFactoryInitialization() 创建所有单例对象之前执行
  • 这样设置后,在 finishBeanFactoryInitialization() 中这些 Bean 将不会被立即创建,从而实现了全局懒加载

7. 注意事项

  1. 启动性能提升:懒加载可以显著减少应用启动时间,因为大部分 Bean 直到真正使用时才创建
  2. 内存占用减少:Spring Boot 3.4 的懒加载特性可以让内存占用减少 80%
  3. 潜在问题:所有 Bean 都延迟初始化可能导致某些依赖关系问题,需要谨慎使用

总结

spring.main.lazy-initialization=true 配置的核心实现类是 LazyInitializationBeanFactoryPostProcessor 。这个 BeanFactoryPostProcessor 会在 Spring 容器刷新时遍历所有 BeanDefinition,并将那些没有被排除的 Bean 的 lazyInit 属性设置为 true,从而实现了全局的延迟初始化效果。

相关推荐
Escalating_xu29 分钟前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅1 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路1 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
Flynn Liang1 小时前
Spring AI 上生产:限流熔断、密钥与成本治理、私有化/混合部署、降级与 Prompt 灰度架构全解
人工智能·spring·架构·高可用·springai·成本治理·生产架构
AntsData2 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat2 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰2 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang2 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞2 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长2 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统