spring引导交叉引用问题随机发生

3j86kqsm  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(356)

我在构建spring boot项目时遇到了一个循环依赖(交叉引用)问题,依赖趋势如下:
处理器类通过构造函数注入自动连接标准类;
通过构造函数注入的criteria类自动连接cachemanager;
cahcemanager类通过setter注入自动连接ruleset类;
规则集类通过构造函数注入再次自动连接处理器。

The dependencies of some of the beans in the application context form a cycle:
   app
┌─────┐
|  XXXProcessor defined in file ...
↑     ↓
|  XXXCriteria defined in file ...
↑     ↓
|  XXXCacheManager
↑     ↓
|  XXXRuleSet defined in file ...
└─────┘

虽然我可以努力从ruleset类中删除processor的依赖关系,但我想知道是否有一种方法可以保留当前引用,但仍然可以消除这里介绍的交叉引用问题?我查阅了这个论坛,有人建议@lazy注解可能会有所帮助。我尝试将它应用于processor类或ruleset类(在类级别或方法级别),但问题并没有消失。
另一个观察结果是,上面提到的错误并不是一直出现的-有时程序进行得很好,是随机发生的错误使我受到了困扰。为什么会这样?

bvjveswy

bvjveswy1#

可以在一个地方用字段注入替换构造函数注入。它将打破循环对象示例化的循环。
很难说为什么这个问题时有发生。也许,有一些 @Configuration 根据配置值构建同一接口的不同实现的类。你应该提供更多的细节来处理这个问题。

r6vfmomb

r6vfmomb2#

解决这个问题的一种方法是用一个示例替换一个示例 Provider 这样地:

public Processor(Provider<Criteria> criteria) {
    this.criteria = criteria;
}

当你使用它的时候你需要 get() 我先来。

Criteria c = this.criteria.get();

这意味着 Processor 可以在 Criteria 自从那次注射 Provider 会得到 Criteria 准备好了就吃豆子。
这意味着你不能打电话 get() 否则会出现运行时错误,因为这仍然意味着循环构造依赖关系。 @Lazy 只是意味着spring应该等待bean的初始化,直到它真正被请求,而不是在启动时急切地创建它(这是标准行为)。这对循环依赖项和注入其他bean构造函数的bean都没有影响。它对于初始化速度非常慢并且几乎总是必须从 Provider 推迟初始化。

相关问题