我有一个服务,它使用一些对象作为通用
@Component
@RequiredArgsConstructor
public class SomeGenericService<T extends Base> {
private final T base;
public void someWork(String info) {
base.someAction(info);
}
}
我还有3个用@Component
(Base1
、Base2
、Base3
(标记的Base
实现
我希望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);
}
}
但在发布后,春天不明白我想从中得到什么。
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
注释手动配置?
您需要定义应该如何注入这些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());
}
}