我有一个使用一些对象作为通用对象的服务
@Component
@RequiredArgsConstructor
public class SomeGenericService<T extends Base> {
private final T base;
public void someWork(String info) {
base.someAction(info);
}
}
我还有 3 个 Base
实现标记为 @Component
(Base1
, Base2
, Base3
)
我希望 spring 自己创建一个具有它需要的泛型的服务,如下面的例子
@Component
@RequiredArgsConstructor
public class Runner implements CommandLineRunner {
private final SomeGenericService<Base1> s1;
private final SomeGenericService<Base2> s2;
private final SomeGenericService<Base3> s3;
@Override
public void run(String... args) throws Exception {
String someString = "text";
s1.someWork(someString);
s2.someWork(someString);
s3.someWork(someString);
}
}
但是在启动之后,spring 不明白我想从它那里得到什么。
Parameter 0 of constructor in SomeGenericService required a single bean, but 3 were found:
- base1: defined in file [Base1.class]
- base2: defined in file [Base2.class]
- base3: defined in file [Base3.class]
是否可以将其设置为自动,而无需通过每个服务的 @Bean
注释手动配置?
最佳答案
您需要定义应该如何注入(inject)这些 bean。为此,最好使用一些 @Configuration
。像这样的东西:
@Configuration
@Import({
Base1.class,
Base2.class,
Base3.class
})
public class SomeConfig {
@Bean
SomeGenericService<Base1> someGenericService1() {
return new SomeGenericService(new Base1());
}
@Bean
SomeGenericService<Base2> someGenericService2() {
return new SomeGenericService(new Base2());
}
@Bean
SomeGenericService<Base3> someGenericService3() {
return new SomeGenericService(new Base3());
}
}
关于java - Spring在构造函数中使用泛型多次创建泛型服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71090734/