我有一个循环引用在我的一个项目中使用 spring,我无法修复它,并且在启动时失败并出现以下错误:
'org.springframework.security.authenticationManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
我尝试在示例项目中以较小的级别重新创建相同的问题(没有我工作项目的所有细节)。然而,我一直无法想出一个合理的场景,即 spring 因错误而失败。 这是我所拥有的:
public class ClassA {
@Autowired
ClassB classB;
}
public class ClassB {
@Autowired
ClassC classC;
}
@Component
public class ClassC {
@Autowired
ClassA classA;
}
@Configuration
public class Config {
@Bean
public ClassA classA() {
return new ClassA();
}
@Bean
public ClassB classB() {
return new ClassB();
}
}
我的项目中有一个类似的场景,但失败了,我希望 spring 也会在我的示例项目中提示。但它工作正常!谁能给我一个简单的例子,说明如何用循环引用错误打破 Spring ?
编辑:我使用 javax.inject.Provider 解决了这个问题。两个项目中唯一的其他区别是使用的注解是 javax.inject.Inject 和 javax.annotation.ManagedBean 代替了@Autowired 和@Component。
最佳答案
您可以使用 @Lazy
来指示 bean 是延迟创建的,从而打破了 Autowiring 的急切循环。
这个想法是循环中的一些 bean 可以被实例化为代理,并且在真正需要它的那一刻它将被初始化。这意味着,除了作为代理的 bean 之外,所有 bean 都被初始化。第一次使用它会触发配置,因为其他 bean 已经配置,所以不会有问题。
来自 Spring-Jira 中的一个问题:
@Lazy annotation that can be used in conjunction with @Configuration to indicate that all beans within that configuration class should be lazily initialized. Of course, @Lazy may also be used in conjunction with individual @Bean methods to indicate lazy initialization on a one-by-one basis. https://jira.springsource.org/browse/SJC-263
意味着将 bean 注释为 @Lazy
就足够了。或者,如果您更喜欢将配置类注释为 @Lazy
,如下所示:
@Configuration
@Lazy
public class Config {
@Bean
public ClassA classA() {
return new ClassA();
}
@Bean
public ClassB classB() {
return new ClassB();
}
}
如果您实现 bean 的接口(interface),这将非常有效。
关于java - Spring循环引用示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348794/