假设我有以下内容
public abstract class MyClass {
@Resource
protected MyService myService;
doSomething() {
return myService.doSomething();
}
}
public class MyServiceV1 implements MyService {}
public class MyServiceV2 implements MyService {}
public class MyClassV1 extends MyClass {
//WANT TO USE MyServiceV1 implementation
}
public class MyClassV2 extends MyClass {
//WANT TO USE MyServiceV2 implementation
}
我无法指定我想要在每个子类中使用的服务实现。我考虑过使用@Qualifier,但我必须在每个子类中重新声明该属性并在那里使用它,并希望它覆盖父类。
这些类的目的是同时提供两个版本的 API。因此两个版本将同时激活。
就 spring 注入(inject) beans 的方式而言,确实感觉这是一种反模式,因此我对其他方法持开放态度。
最佳答案
我认为您可以尝试使用构造函数注入(inject)在您的类中设置特定服务。像这样:
public abstract class MyClass {
protected MyService myService;
doSomething() {
return myService.doSomething();
}
}
class MyClassV1 extends MyClass {
MyClassV1(MyService myService) {
this.myService = myService;
}
}
class MyClassV2 extends MyClass {
MyClassV2(MyService myService) {
this.myService = myService;
}
}
@Bean
MyClassV1 myClassV1() {
return new MyClassV1(myServiceV1());
}
@Bean
MyClassV1 myClassV2() {
return new MyClassV2(myServiceV2());
}
@Bean
MyServiceV1 myServiceV1() {
return new MyServiceV1();
}
@Bean
MyServiceV2 myServiceV2() {
return new MyServiceV2();
}
或 setter 注入(inject):
public abstract class MyClass {
private MyService myService;
public void setMyService(MyService myService) {
this.myService = myService;
}
}
@Component
public class MyClass1 extends MyClass {
@Autowired @Qualifier("myService1")
@Override
public void setMyService(MyService myService) {
super.setMyService(myService);
}
}
@Component
public class MyClass2 extends MyClass {
@Autowired @Qualifier("myService2")
@Override
public void setMyService(MyService myService) {
super.setMyService(myService);
}
}
关于java - 具有 2 个子类的 Spring 父类使用 2 个不同的 bean 作为属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57562884/