当 @Autowired 和 @Bean 出现在同一个类中时出现 BeanCurrentlyInCreationException

Jat*_*hoo 6 java spring circular-dependency javabeans autowired

@Configuration
public class Test1 {

    @Autowired
    private Test3 test3;

}

@Configuration
public class Test2 {

    @Autowired
    private Test3 test3;

    @Bean(name = "test3 ")
    Test3 test3 () {
        return new Test3(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给出了以下错误。

导致:org.springframework.beans.factory.BeanCreationException:创建名称为“test1”的bean时出错:自动装配依赖项注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException: 无法自动装配字段: private Test3 com.package.name.Test1.test3;

嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“test2”的 bean 时出错:自动装配依赖项注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException: 无法自动装配字段: private Test3 com.package.name.Test2.test3;

嵌套异常是org.springframework.beans.factory。BeanCurrentlyInCreationException:创建名为“test3”的 bean 时出错:请求的 bean 当前正在创建中:是否存在无法解析的循环引用?

这是一个循环依赖的例子吗?如果是的话,有什么解决这个问题的想法吗?

Plo*_*log 0

您不需要自动装配在同一个类中定义的 bean,因为您可以通过调用初始化方法 test3() 直接引用该 bean。

@Configuration
public class Test2{

    @Bean(name = "test3 ")
    Test3 test3 () {
        return new Test3(); 
    }

    public void exampleOfUsingTest3Bean() {
        System.out.println("My test3 bean is" + test3().toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

事实上,您不应该做您想要做的事情,因为 @Autowired 字段在构造类时被注入到类中,并且此时不存在名为 Test3 的 bean,因为它是由正在构造的类的方法定义的。理论上,您可以将此 @Bean 方法定义为静态,并且它应该可用于自动装配,但您不应该这样做。

@Bean(name = "test3 ")
public static Test3 test3 () {
    return new Test3(); 
}
Run Code Online (Sandbox Code Playgroud)