问题描述
@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更新的最新版