0

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

我尝试为其他三个需要的类(图像的注释代码)创建用 @Bean 注释的方法,因此当创建这三个(B、C、D)时,也许可以使用 @ConditionalOnBean 注释创建一个 bean。但是以这种方式,我不知道如何返回一个 D 的 bean,它是一个接口,而不是一个类,就像 B 和 C 运行良好那样。

//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 来创建 A 的 bean,而 D 是一个接口,我该如何创建它?

非常感谢你的帮助!

4

1 回答 1

0

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

否则,您也可以对 D 执行以下操作:

return new D() { 
    // provide implementation of abstract method if any
};
于 2019-08-05T17:15:58.527 回答