【问题标题】:Hierarchical Bean Dependency in Spring BootSpring Boot 中的分层 Bean 依赖
【发布时间】:2018-02-10 06:15:07
【问题描述】:

我有一个与父类 S 相同的 bean 依赖层次结构:

A -> B -> C

其中 Bean A 包含 bean B,bean B 包含 C,代码结构如下:

public class A extends S {
    private S successor;
}

public class B extends S {
    private S successor;       
}

public class C extends S {       
    private S successor;
}

在实施时我有

A a = new A();
B b = new B();
C c = new C();
a.successor = b;
b.successor = c;

我在这里真正想做的是在Configuration中设置所有上面的bean创建和依赖关系,而不是在代码中硬编码;类似:

@Configuration
public class MyConfig {


    @Bean
    public A a {
        return new A();
    }

    @Bean
    public B b {
        B b = new B();
        A a; // somehow get the bean A here
        a.successor = b;
    }

    @Bean
    public C c {
        C c = new C();
        B b; // somehow get the bean b here
        b.successor = c;
    }
}

关于如何使用 Spring Boot 依赖注入解决此问题的任何意见?

【问题讨论】:

    标签: java spring spring-boot dependency-injection aop


    【解决方案1】:

    您可以将所需的 bean 作为参数传递给您的提供者方法。

    @Bean
    public A a() {
        return new A();
    }
    
    @Bean
    public B b(A a) {
        B b = new B();
        a.successor = b;
        return b;
    }
    
    @Bean
    public C c(B b) {
        C c = new C();
        b.successor = c;
        return c;
    }
    

    但是,这仅在 B 注入某处时才设置 a.successor。我相信这不是您所期望的,并且需要反转构造链:

    @Bean
    public A a(B b) {
        A a = new A();
        a.successor = b;
        return a;
    }
    
    @Bean
    public B b(C c) {
        B b = new B();
        b.successor = c;
        return b;
    }
    
    @Bean
    public C c() {
        return new C();
    }
    

    【讨论】:

    • 这是一种方法,但我的问题是 bean A 和 B 如何知道分别调用了 bean B 和 C 的哪个实例。我们可能有多个 bean 实例。在这种情况下,A 或 B 不知道我们使用的是哪个 bean。是否可以围绕 @Autowired 编写一些内容来帮助解决正确的 bean 继任者?
    • 您没有提到原始问题中需要多个实例。限定词是否足以解决您的问题?参见例如stackoverflow.com/questions/40830548/…
    • OK 这有帮助。我试过你的方法,除了最后一个障碍外,它几乎可以工作。 bean 没有注入到我想在其中使用它们的类中。但是它们被注入到 service 类中。我将该类定义为Component,但它仍然不起作用。你以前遇到过这个问题吗?
    • 更新:我也设法解决了最后一个问题。我正在创建一个 Component 类的对象,我在其中使用传统的 java 新语法来使用所有 bean,而不是为它注入 bean。非常感谢@Lesiak:D
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 2018-09-21
    • 2020-10-02
    • 2020-09-10
    • 2018-06-21
    • 2012-08-02
    • 2020-08-28
    • 2019-02-26
    相关资源
    最近更新 更多