我有循环依赖和
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;
- }