解决spring循环依赖问题

2024-01-23 22:15:18 浏览数 (2)

前言

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

循环分两种情况:

  • 一种是直接去改变业务,让业务不会出现那种循环依赖的情况。
  • 一种就是使用懒加载的方式,让两个对应的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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞