我有循环依赖和
java配置.虽然用xml配置解决它很简单,我无法解决它与java配置没有@Autowired.豆:
public class A { private B b; public B getB() { return b; } public void setB(B b) { this.b = b; } } public class B { private A a; public A getA() { return a; } public void setA(A a) { this.a = a; } }
我已经尝试过(我已经读过@Bean注释Spring不会调用方法,每次bean被引用,但在这种情况下,它实际上一直被调用):
@Configuration public class Config { @Bean public A a() { A a = new A(); a.setB(b()); return a; } @Bean public B b() { B b = new B(); b.setA(a()); return b; } }
而且,用@Autowired的配置类字段:
@Configuration public class Config { @Autowired A a; @Autowired B b; @Bean public A a() { A a = new A(); a.setB(b); return a; } @Bean public B b() { B b = new B(); b.setA(a); return b; } }
此外,我已经尝试所有上述与@Lazy注释.没有帮助但是,如果我用@Autowired注释A和B的设置器,效果会很好.但这不是我现在想要的.我做错了什么,有没有办法解决循环依赖在java配置没有使用@Autowired?
解决方法
你想要得到的行为如下
A a = new A(); B b = new B(); a.setB(b); b.setA(a);
@Bean方法不给你.他们运行完成以提供一个bean实例.
您基本上必须部分创建一个实例,然后在创建另一个实例时完成初始化.
@Configuration class Config { @Bean public A a() { A a = new A(); return a; } @Bean public B b() { B b = new B(); A a = a(); b.setA(a); a.setB(b); return b; } }
要么
@Bean public B b(A a) { B b = new B(); b.setA(a); a.setB(b); return b; }