Spring parent with 2 child 类 使用 2 个不同的 bean for 属性
Spring parent with 2 child classes use 2 different beans for property
假设我有以下
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
}
我无法指定我想在每个子class 中使用的服务实现。我考虑过使用 @Qualifier 但我必须 re-declare 每个 child class 中的 属性 并在那里使用它,并希望它覆盖 parent .
这些 classes 的目的是同时提供 API 的两个版本。所以两个版本将同时激活。
就 spring 注入 bean 的方式而言,这确实是一种反模式,因此我对其他方法持开放态度。
我认为您可以尝试使用构造函数注入在您的 类 中设置特定服务。像这样:
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注入:
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);
}
}
假设我有以下
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
}
我无法指定我想在每个子class 中使用的服务实现。我考虑过使用 @Qualifier 但我必须 re-declare 每个 child class 中的 属性 并在那里使用它,并希望它覆盖 parent .
这些 classes 的目的是同时提供 API 的两个版本。所以两个版本将同时激活。
就 spring 注入 bean 的方式而言,这确实是一种反模式,因此我对其他方法持开放态度。
我认为您可以尝试使用构造函数注入在您的 类 中设置特定服务。像这样:
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注入:
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);
}
}