java - Spring循环引用示例

标签 java spring dependency-injection autowired circular-reference

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

相关文章:

java - move 文件而不释放锁

java - 我的迭代器稍微关闭了......知道如何修复它吗?

java - 如何创建特定的类构造函数

spring - 如何在 IntelliJ 的 Spring Boot 项目中使用实时编辑

hibernate - 从sessionFactory切换到EntityManager后,InvalidDataAccessApiUsageException

php - php中这两种构造函数注入(inject)有什么区别?

java - 如何在 Java 中使用 .Net dll

spring - Spring Boot中的WebMvcTest

java - Grails 与另一个 Spring 应用程序的集成 - 数据源过载

java - 是否有一种可接受的方法来保持这些层/依赖关系分离?