科普文:一文搞懂Spring中常用的注解【@lazy注解的原理、核心类、应用场景】

概叙

科普文:一文搞懂Spring中常用的注解-CSDN博客

科普文:Java基础系列之深入理解Java注解、反射与代理机制_java 注解代理-CSDN博客

科普文:SpringBoot核心注解及应用梳理-CSDN博客

科普文:Java基础系列之【@Async注解遇上循环依赖的坑】_async循环依赖-CSDN博客

科普文:Java基础系列之【Spring参数注解@Value 和@ConfigurationProperties 便捷读取配置信息】-CSDN博客

科普文:spring boot中常用的接口、工具栏、注解整理_springboot接口-CSDN博客

前面有对java注解、spring注解做过梳理,这里我们再看看Spring框架中@Lazy注解的原理、核心类、应用场景。

注解核心目的典型场景耦合度
@Lazy延迟初始化资源密集型对象、启动优化
@Component组件注册通用业务逻辑类
@Order执行顺序控制集合注入排序、切面优先级
@DependsOn初始化顺序强制依赖隐式依赖的 Bean 初始化顺序控制

注解@Lazy

@Lazy‌原理


通过代理机制或延迟初始化策略,将 Bean 的创建推迟到首次实际使用时,而非容器启动阶段。


@Lazy‌核心类

LazyInitBeanFactoryPostProcessor(Spring 内部处理延迟初始化的核心类)。

@Configuration
public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        for (String beanName : beanFactory.getBeanDefinitionNames()) {
            beanFactory.getBeanDefinition(beanName).setLazyInit(true); //全局启动慢加载
        }
    }
}

LazyInitBeanFactoryPostProcessor 是 Spring 框架中用于实现 Bean 延迟加载(Lazy-Init)的扩展机制,属于 BeanFactoryPostProcessor 接口的实现类。

其主要作用是通过修改 BeanDefinition 的 lazyInit 属性,动态控制 Bean 的初始化时机,从而优化容器启动性能。

  1. 延迟加载的作用
    通过设置 lazyInit=true,Bean 会在首次被请求时初始化,而非容器启动阶段初始化。这减少了启动时的资源消耗,特别适用于大型应用中非核心或低频使用的 Bean。

  2. 与 BeanFactoryPostProcessor 的关系

    • 执行时机‌:在容器加载所有 BeanDefinition 完成后、Bean 实例化前触发。
    • 操作对象‌:直接修改 BeanDefinition 的属性(如 lazyInit)或注册新的 BeanDefinition。
    • 典型场景‌:批量配置 Bean 的延迟初始化,替代 XML 或注解中逐个 Bean 的手动声明。
  3. 与相关组件的对比

    组件操作目标执行阶段典型用途
    BeanFactoryPostProcessorBeanDefinitionBean 实例化前修改 Bean 定义属性(如 lazyInit)
    BeanPostProcessorBean 实例Bean 初始化前后(实例已创建)AOP 代理、属性注入增强
    FactoryBean复杂 Bean 创建逻辑Bean 实例化阶段自定义复杂对象的实例化过程

@Lazy‌应用场景

  • 优点:减少启动时间,节省资源。
  • 缺点:首次调用时可能产生延迟,增加调试难度。

应用场景包括优化启动时间、处理资源消耗大的Bean和解决循环依赖。‌

  • 优化启动速度(减少初始化耗时 Bean)
  • 处理资源密集型对象(如数据库连接池)
  • 解决循环依赖(配合构造器注入)

注意事项

  • 默认单例模式下有效,原型 Bean 每次都会重新初始化。
  • 避免与其他作用域注解(如 @Scope)冲突。
  • 性能权衡‌:全局启用延迟加载可能导致首次请求响应延迟,需结合实际场景选择。
  • Bean 依赖冲突‌:若两个延迟加载的 Bean 存在依赖关系,可能引发初始化顺序问题。
  • 框架整合‌:MyBatis 等框架通过 MapperScannerConfigurer(本质为 BeanFactoryPostProcessor)动态注册 Mapper 接口,类似机制可参考。

代码案例

@Configuration
public class AppConfig {
    @Bean
    @Lazy // 延迟初始化
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

 延迟加载数据库连接池HikariDataSource。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01Byte空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值