了解Spring上下文初始化顺序

时间:2011-04-12 08:47:52

标签: java spring javabeans

我有一组复杂的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,它在系统中经常用于身份验证。

1 个答案:

答案 0 :(得分:8)

最好的解决方案就是取出循环依赖;我还没有遇到这样一种结构得到保证的情况。但是,如果你确实想坚持下去,那么你上面的问题可能是因为你在某处有构造函数注入:

  

循环依赖   如果您主要使用构造函数注入,则可以编写和配置类和bean,以便创建无法解析的循环依赖关系场景。   考虑你有类A的场景,它需要通过构造函数注入提供类B的实例,以及类B,它需要通过构造函数注入提供类A的实例。如果将A类和B类的bean配置为相互注入,则Spring IoC容器将在运行时检测此循环引用,并抛出BeanCurrentlyInCreationException。

     

这个问题的一个可能的解决方案是   编辑一些的源代码   你的课程要通过配置   setters而不是via构造函数。   另一种解决方案是不使用   构造函数注入并坚持   只有二​​传手注射。换一种说法,   虽然除了最稀有的外,通常应该避免   情况,有可能   配置循环依赖关系   二传手注射。不同于典型的   case(没有循环依赖),   bean A之间的循环依赖   和豆B将强制其中一个豆   之前注入另一个   完全初始化(a   经典的鸡肉/鸡蛋情景)。