如何在构造函数中创建需要其他 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
};
我正在尝试创建自己的 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
};