gpt4 book ai didi

java - Spring循环引用示例

转载 作者:IT老高 更新时间:2023-10-28 13:46:42 26 4
gpt4 key购买 nike

我有一个循环引用在我的一个项目中使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com