如何在构造函数中创建需要其他 class 的 class 的 bean?

How can I create a bean of a class that needs other classes in the constructor?

我正在尝试创建自己的 spring-boot-starter。我有一个 class A,它在构造函数 classes B、C 和一个接口 D 中作为参数,我想在自动配置 class 中创建一个用 @Bean 注释的方法returns 是 class A 的实例。

我尝试为其他三个需要的 classes(图像的注释代码)创建用 @Bean 注释的方法,所以当创建这三个(B、C、D)时,可能是 A可以使用 @ConditionalOnBean 注释创建 bean。但是通过这种方式,我不知道如何 return 作为接口的 D 的 bean,而不是像 B 和 C 那样运行良好的 class 。

//Imports and package statement

@Configuration
@ConditionalOnClass(A.class)
public class AutoConfig {

//  @Bean
//  @ConditionalOnMissingBean
//  public B BFactory() {
//      return new B(); // It works
//  }
//  
//  @Bean
//  @ConditionalOnMissingBean
//  public C CFactory() {
//      return new C(); // It works
//  }
//  
//  @Bean
//  @ConditionalOnMissingBean
//  public D DFactory() {
//      return new D(); // I cannot do this because D is an interface
//  }
//  
    @Bean
    //@ConditionalOnBean(A.class, B.class, C.class)
    @ConditionalOnMissingBean
    public A AFactory() {
        return new A(?(B.class), ?(C.class), ?(D.class));
    }
}



//Imports and package statement

@Component
public class A {

    private B attribute1;
    private C attribute2;
    private D attribute3;

    @Autowired
    public A(B b, C c, D d) {
        this.b = b;
        this.c = c;
        this.d = d;
    }

    //Methods...
}

总结一下,如果 B、C 和 D 需要创建它并且 D 是一个接口,我如何创建 A 的 bean?

非常感谢您的帮助!

@Bean 和@Component 都创建了 Spring Bean。所以需要在配置class中声明A的Bean。仅创建 B、C 和 D 的 Bean。它将使用@Autowired自动注入A。
您需要创建一些 D 接口的实现。如果它是从已经声明为 Spring Bean 的任何其他 jar 中提取的,那么您无需在配置中再次声明,它将自动注入。

否则你也可以为 D:

return new D() { 
    // provide implementation of abstract method if any
};