我在构建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类(在类级别或方法级别),但问题并没有消失。
另一个观察结果是,上面提到的错误并不是一直出现的-有时程序进行得很好,是随机发生的错误使我受到了困扰。为什么会这样?
2条答案
按热度按时间bvjveswy1#
可以在一个地方用字段注入替换构造函数注入。它将打破循环对象示例化的循环。
很难说为什么这个问题时有发生。也许,有一些
@Configuration
根据配置值构建同一接口的不同实现的类。你应该提供更多的细节来处理这个问题。r6vfmomb2#
解决这个问题的一种方法是用一个示例替换一个示例
Provider
这样地:当你使用它的时候你需要
get()
我先来。这意味着
Processor
可以在Criteria
自从那次注射Provider
会得到Criteria
准备好了就吃豆子。这意味着你不能打电话
get()
否则会出现运行时错误,因为这仍然意味着循环构造依赖关系。@Lazy
只是意味着spring应该等待bean的初始化,直到它真正被请求,而不是在启动时急切地创建它(这是标准行为)。这对循环依赖项和注入其他bean构造函数的bean都没有影响。它对于初始化速度非常慢并且几乎总是必须从Provider
推迟初始化。