使用RequiredArgsConstructor解决Spring Boot中的循环引用

问题描述 投票:0回答:1

我正在尝试创建 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;
}

对我来说听起来像是糟糕设计的解决方案:使用中介服务。假设我有一个交互服务,其中包括喜欢和不喜欢的服务。这将解决循环引用问题,但是可以从所有其他服务访问喜欢和不喜欢的方法,从而跳过我们可能在交互服务中设置的任何检查(如果直接调用它们)。所以我想避免这种情况。

注意:我决定合并喜欢和不喜欢表并使用枚举来确定交互。我只是出于纯粹的兴趣而寻求解决方案,以防我将来必须处理类似的问题。

java spring lombok
1个回答
0
投票

您可以使用

@Autowired
代替
@Lazy

但正确的解决方案是重新设计您的应用程序。循环依赖是架构问题的标志。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.