我有一组复杂的bean和它们之间的依赖关系。所有bean都是@Service
,@Repository
或@Controller
注释,我使用@PostConstruct
注释。有一些循环依赖,但系统仍然由Spring正确初始化。
然后我添加了一个简单的Controller,它只依赖于一个Services。理论上,系统应该能够启动,因为理论上它可以像以前一样设置系统,然后是新的Controller。但是Spring抱怨它无法建立上下文:
Error creating bean with name 'userService': Requested bean is currently in creation: Is there an unresolvable circular reference?
我可以以某种方式协助Spring如何订购上下文初始化吗?我认为主要问题是userService
,它在系统中经常用于身份验证。
答案 0 :(得分:8)
最好的解决方案就是取出循环依赖;我还没有遇到这样一种结构得到保证的情况。但是,如果你确实想坚持下去,那么你上面的问题可能是因为你在某处有构造函数注入:
循环依赖 如果您主要使用构造函数注入,则可以编写和配置类和bean,以便创建无法解析的循环依赖关系场景。 考虑你有类A的场景,它需要通过构造函数注入提供类B的实例,以及类B,它需要通过构造函数注入提供类A的实例。如果将A类和B类的bean配置为相互注入,则Spring IoC容器将在运行时检测此循环引用,并抛出BeanCurrentlyInCreationException。
这个问题的一个可能的解决方案是 编辑一些的源代码 你的课程要通过配置 setters而不是via构造函数。 另一种解决方案是不使用 构造函数注入并坚持 只有二传手注射。换一种说法, 虽然除了最稀有的外,通常应该避免 情况,有可能 配置循环依赖关系 二传手注射。不同于典型的 case(没有循环依赖), bean A之间的循环依赖 和豆B将强制其中一个豆 之前注入另一个 完全初始化(a 经典的鸡肉/鸡蛋情景)。