弹簧.使用java配置解析循环依赖关系,而不需要@Autowired

前端之家收集整理的这篇文章主要介绍了弹簧.使用java配置解析循环依赖关系,而不需要@Autowired前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有循环依赖和 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;
}
原文链接:https://www.f2er.com/java/124649.html

猜你在找的Java相关文章