java - 具有 2 个子类的 Spring 父类使用 2 个不同的 bean 作为属性

标签 java spring spring-annotations

假设我有以下内容


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/

相关文章:

java - 在 JUnit 测试中捕获键盘输入

Java Spring : Return a response to a request if takes longer then a specified time

spring - GeoPoint 与 Spring Data ElasticSearch 给出错误 : QueryParsingException[field [location] is not a geo_point field]

java - 如何在 Spring servlet 的所有 @RequestMapping 方法上添加过滤器?

hibernate - @autowired 注释问题,不在类中注入(inject) bean,使用 Spring3.0, hibernate

java - 防止 Spring 在一个 Bean 失败时失败

java - 如何以编程方式在 Java 中使用渗透导入 OSM 数据?

java - 从 Firebase 获取最后(5 或 10)个值

java - 如何通过减去 2 个 nanoTime 对象获得有意义的结果?

Spring Boot @Value 属性