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

时间:2018-03-07 09:37:03

标签: java spring javabeans autowired circular-dependency

@Configuration
public class Test1 {

    @Autowired
    private Test3 test3;

}

@Configuration
public class Test2 {

    @Autowired
    private Test3 test3;

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

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

  

引起:   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当前正在创建:是否存在无法解析的循环引用?

这是一个循环依赖的例子?如果是的话,任何有关解决这个问题的想法。

1 个答案:

答案 0 :(得分: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());
    }
}

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

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