2011-04-12 136 views
4

我有一套复杂的bean和它们之间的依赖关系。所有豆类都注有@Service,@Repository@Controller,我使用@PostConstruct注释。有一些循环依赖,但系统仍然被Spring正确初始化。了解Spring上下文初始化顺序

然后我添加了一个简单的控制器,只依赖于其中一个服务。理论上,系统应该能够启动,因为理论上它可以先设置系统,然后再设置新的控制器。但是春天抱怨说,它不能建立上下文:

Error creating bean with name 'userService': Requested bean is currently in creation: Is there an unresolvable circular reference?

我能以某种方式帮助阳春如何订购上下文初始化?我认为主要问题是userService,它通过系统用于认证目的很多。

回答

7

最好的解决方案就是取消循环依赖;我还没有遇到这样的结构是有保证的情况。但是,如果你想坚持下去,那么也许你的上述问题是由于这样的事实,你有地方构造器注入:

循环依赖 如果使用构造器注入也可以编写和配置类和bean,从而创建一个无法解析的循环依赖性场景。 考虑这样一种场景,其中需要通过构造函数注入来提供类B的实例的类A以及需要通过构造函数注入来提供类A的实例的类B。如果您将类A和B的bean配置为相互注入,则Spring IoC容器将在运行时检测到此循环引用,并引发BeanCurrentlyInCreationException。

一个可能的解决这个问题是通过 制定者 而不是通过构造函数来编辑的一些 您的类的源代码进行配置。 另一种解决方案是不使用 构造函数注入并仅使用 setter注入。换句话说, 虽然除了最稀罕的 的情况下通常应该避免,但有可能 与 配置循环依赖关系设置注入。不同于典型 情况下(不具有循环依赖), 豆之间的循环依赖甲 和豆乙将迫使豆 之一被注入到另一个之前 被完全初始化本身( 经典鸡/蛋场景)。

相关问题