我正在尝试创建 java spring boot 服务,但遇到以下问题。假设我们有一个带有喜欢和不喜欢表的约会应用程序。我们需要检查用户过去是否进行过交互,如果确实进行了交互,我们可能需要抛出异常。所以类可能必须看起来像这样:
@Service
@RequiredArgsConst
public class LikeService {
private final DislikeService dislikeService;
public void method() {
// check if dislike exists and save
}
}
@Service
@RequiredArgsConst
public class DislikeService {
private final LikeService likeService;
public void method() {
// check if like exists and save
}
}
这肯定会导致循环引用错误。在不改变设计的情况下解决这个问题的解决方案是:
@Service
@RequiredArgsConst
public class LikeService {
@Lazy
private final DislikeService dislikeService;
}
但是,
@lazy
注释将被忽略。有什么方法可以仅在特定字段上使用 @RequiredArgsConstructor
和 @lazy
注释吗?我希望生成的构造函数对于类似的服务看起来像这样:
public LikeService(final RandomService randomService, final AnotherService anotherService, @Lazy final DislikeService dislikeService) {
this.randomService = randomService;
this.anotherService = anotherService;
this.dislikeService = dislikeService;
}
对我来说听起来像是糟糕设计的解决方案:使用中介服务。假设我有一个交互服务,其中包括喜欢和不喜欢的服务。这将解决循环引用问题,但是可以从所有其他服务访问喜欢和不喜欢的方法,从而跳过我们可能在交互服务中设置的任何检查(如果直接调用它们)。所以我想避免这种情况。
注意:我决定合并喜欢和不喜欢表并使用枚举来确定交互。我只是出于纯粹的兴趣而寻求解决方案,以防我将来必须处理类似的问题。
您可以使用
@Autowired
代替 @Lazy
。
但正确的解决方案是重新设计您的应用程序。循环依赖是架构问题的标志。