前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决spring循环依赖问题

解决spring循环依赖问题

原创
作者头像
查拉图斯特拉说
发布2024-01-23 22:15:18
2601
发布2024-01-23 22:15:18
举报
文章被收录于专栏:后端架构

前言

今天在写代码的时候出现突然出现了一个循环依赖的异常。循环依赖,可能这是一个在日常工作中非常常见的异常。这篇博客的主要目的是用来处理这种循环依赖的情况。

循环分两种情况:

  • 一种是直接去改变业务,让业务不会出现那种循环依赖的情况。
  • 一种就是使用懒加载的方式,让两个对应的Bean,加载方式起到一个先后顺序这样,处理依赖冲突。

目的

我们这一小节主要是在讲如何处理这个循环依赖,从代码方面实现一个懒加载的方式。因为日常工作中我们可能只需要用一个lazy注解就可以处理了。嗯但是很多人还是会用到lombok这种注解的方式。所以这一章节主要是是介绍使用lombok去做一个懒加载的处理方式。

异常逻辑

这是一个出现循环异常的一个依赖类。这里面用到了lombok这种方式去实现一个Bean的注入。

代码语言:javascript
复制
@Log4j2
@Component
@RequiredArgsConstructor
public class ServiceMonitorReceiver implements ApplicationInit, ApplicationListener<AutoUpdateCrontabEvent> {

    private final MonitorServiceRecordService monitorServiceRecordService;

    private final LinuxCrontabDao linuxCrontabDao;

    private final SystemConfig systemConfig;

常见的做法就直接使用lazy的方式,但是注解放到这里是不管用的。

代码语言:javascript
复制
    @Lazy
    Private final MonitorServiceRecordService monitorServiceRecordService;

紧接着我们找到了他的一个构造方法的实现类。这里我们可以看到他对不同的JKD版本进行一个构造法的度的时候,详细说明了一个点。DK 7和DK 8它的构造方法的参数是不一样的。

代码语言:javascript
复制
	/**
	 * Any annotations listed here are put on the generated constructor.
	 * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>
	 * up to JDK7:<br>
	 *  {@code @RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}<br>
	 * from JDK8:<br>
	 *  {@code @RequiredArgsConstructor(onConstructor_={@AnnotationsGohere})} // note the underscore after {@code onConstructor}.
	 * 
	 * @return List of annotations to apply to the generated constructor.
	 */
	AnyAnnotation[] onConstructor() default {};

在这里特别声明了JDK 7和JDK 8。我们可以看到只是一个下划线的区别。但就就下划线的区别会影响他的代码逻辑实现你的懒加载成不成功。就是靠着这个细节的点去处理。

  • up to JDK7:
    • {@code @RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}
    • from JDK8:
    • {@code @RequiredArgsConstructor(onConstructor_={@AnnotationsGohere})} // note the underscore after {@code onConstructor}.

解决方法

使用使用懒加载@RequiredArgsConstructor(onConstructor_ = {@Lazy})这种方式处理懒加载

总结

最后总结一下,再碰到问题的时候,还是要去先看一下他的代码注解。有些时候去看一下他的代码,自己或者是可能解决相应的一些问题。习惯性上阅读别人的代码。对自己也很有帮助。

最后 点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 目的
  • 异常逻辑
  • 解决方法
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档