SpringBean的@Lazy懒加载失效踩坑-Xxljob客户端版本影响

问题描述

@Lazy注解(org.springframework.context.annotation包下)用于SpringBean初始化的懒加载,个人平时用的比较少,最近在自己项目里测试了一下,结果不管加在@Component或者@Bean上都不生效,其他也没有额外影响初始化的注解了
示例:

@Lazy
@Component
@Slf4j
public class TestLazySpringBean2 implements Serializable {

    final private static long serialVersionUID = 1L;

    private String someString;

    public TestLazySpringBean2(String someString) {
        log.info("调用了TestLazySpringBean2有参构造");
        this.someString = someString;
    }

    public TestLazySpringBean2() {
        log.info("调用了TestLazySpringBean2无参构造");
    }
}

困惑了我很久,最终发现是xxljob的影响

前言

写在前面:xxljob是优秀的分布式定时任务项目,没有黑的意思,只是单纯记录一下问题

发现问题的过程

个人还没有看源码的习惯,比较费时,直接走测试逻辑了
于是我又建了一个Bean,不开启懒加载

@Component
@Slf4j
public class TestLazySpringBean implements Serializable {

    final private static long serialVersionUID = 1L;

    private String someString;

    public TestLazySpringBean(String someString) {
        log.info("调用了TestLazySpringBean有参构造");
        this.someString = someString;
    }

    public TestLazySpringBean() {
        log.info("调用了TestLazySpringBean无参构造");
    }
}

查看启动SpringBoot项目后,日志的打印,会发现两个Bean初始化的时段完全不同,懒加载的Bean是处于最后了,而这两个Bean名字差不多,IOC容器中的Bean是按名字初始化的

...
2023-04-02 12:33:02.026  INFO 21864 --- [  restartedMain] c.s.t.d.m.t.spring.TestLazySpringBean    : 调用了TestLazySpringBean无参构造
...
n多Bean,此处省略
....
2023-04-02 12:33:06.451  INFO 21864 --- [  restartedMain] c.s.t.d.m.t.spring.TestLazySpringBean2   : 调用了TestLazySpringBean2无参构造
2023-04-02 12:33:06.452  INFO 21864 --- [  restartedMain] c.xxl.job.core.executor.XxlJobExecutor   : >>>>>>>>>>> xxl-job register jobhandler success, name:testJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@165c113e[class com.slipperysoap.test.batchservice.jobhandler.TestJobHandler#testJobHandler]
....

因此猜测:受到了某个组件的影响,再次扫描了所有Bean,并做了处理(没看源码,所以仅仅是猜测)
于是:在懒加载的Bean的无参构造器里上打断点调试,重新启动项目
启动后,断点生效
在这里插入图片描述
一直单步往外调试,查看哪里调用了

在这里插入图片描述
一直跳到这里,Oh~~~原来是你啊

于是把Xxljob相关配置和使用注了,再启动,发现已经懒加载的SpringBean不再会在启动时初始化了
但是总不能不用组件来实现懒加载吧?
要么:自己实现,重写源码
要么:官方实现,等待版本更新
懒人喜欢先看看后者,我也是
在这里插入图片描述
哟,还真有更新,最近刚刚更新的,现在写这篇blog是2023-04-02,作者是2023-03-23更新的,上个礼拜4,好巧呀
我的之前版本是2.3.1的,就差了一个版本,于是放进项目里更新了一下再试试,还真的可以了
猜测2.4.0版本中,执行器的实现,不会去扫描使用所有的SpringBean并做处理,进而影响懒加载了,之前的版本会有影响(我乱猜的,没看源码)

解决办法

升级xxljob客户端到2.4.0版本,2023-03-23更新的最新版

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值