Java 理解Spring上下文初始化顺序
我有一组复杂的bean以及它们之间的依赖关系。所有bean都是Java 理解Spring上下文初始化顺序,java,spring,javabeans,Java,Spring,Javabeans,我有一组复杂的bean以及它们之间的依赖关系。所有bean都是@Service,@Repository或@Controller注释的,我使用@PostConstruct注释。存在一些循环依赖项,但系统仍然由Spring正确初始化 然后,我添加了一个简单的控制器,它只依赖于其中一个服务。理论上,系统应该能够启动,因为理论上,它可以先像以前一样设置系统,然后再设置新的控制器。但Spring抱怨说它无法建立上下文: 创建名为“userService”的bean时出错:请求的bean当前正在创建中:是否
@Service
,@Repository
或@Controller
注释的,我使用@PostConstruct
注释。存在一些循环依赖项,但系统仍然由Spring正确初始化
然后,我添加了一个简单的控制器,它只依赖于其中一个服务。理论上,系统应该能够启动,因为理论上,它可以先像以前一样设置系统,然后再设置新的控制器。但Spring抱怨说它无法建立上下文:
创建名为“userService”的bean时出错:请求的bean当前正在创建中:是否存在无法解析的循环引用?
我可以帮助Spring对上下文初始化进行排序吗?我认为主要的问题是
用户服务
,它在系统中被大量用于身份验证目的。最好的解决方案就是去掉循环依赖;我还没有遇到过这样一种情况,即这种结构是值得的。但是,如果您确实想坚持使用它,那么上述问题可能是由于您在某个地方进行了构造函数注入:
循环依赖
如果您主要使用构造函数注入,则可以编写和配置类和bean,从而创建无法解决的循环依赖场景。
考虑具有类A的场景,这需要通过构造函数注入和类B提供类B的实例,这需要通过构造函数注入提供类A的实例。如果为类A和类B配置bean以相互注入,Spring IoC容器将在运行时检测到该循环引用,并抛出BeanCurrentlyIncrementationException
解决这个问题的一个可能办法是
若要编辑以下部分的源代码:
要通过配置的类
setters而不是via构造函数。
另一个解决方案是不使用
构造函数注入并坚持
仅限塞特注射。换句话说,,
但除了最罕见的
情况,有可能
使用配置循环依赖项
塞特注射。不像典型的
案例(无循环依赖关系),
bean和
bean B将强制其中一个bean
注入另一个之前
完全初始化自身(a)
经典的鸡/蛋场景)