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);
    }
}