前言
今天在写代码的时候出现突然出现了一个循环依赖的异常。循环依赖,可能这是一个在日常工作中非常常见的异常。这篇博客的主要目的是用来处理这种循环依赖的情况。
循环分两种情况:
- 一种是直接去改变业务,让业务不会出现那种循环依赖的情况。
- 一种就是使用懒加载的方式,让两个对应的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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!