当前位置: 首页 > 知识库问答 >
问题:

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

郭洋
2023-03-14

假设我有以下几点


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是如何注入豆子的角度来看,这确实是一种反模式,所以我对其他方法持开放态度。

共有1个答案

康烨伟
2023-03-14

我认为您可以尝试使用构造函数注入在类中设置特定的服务。Smth是这样的:

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);
    }
}
 类似资料:
  • Spring配置:我创建了2个bean,引用了相同的类但不同的数据库会话。 现在有没有办法将id为“abc1”的bean设置为用于自动装配的默认bean,并在像这样明确提到时使用abc2进行自动装配: 解决方案: 使abc1默认为自动连接。 为了创建abc2的实例,我们可以使用:

  • 问题内容: 我有以下定义。 在我的bean定义中,我有两个相同类型的bean 如果有所不同,则从另一个xml文件导入第二个bean。它们也设置了不同的属性。为什么spring不会抛出错误,因为已经定义了2个相同类型的bean。它是否使用变量名,因为它们与bean id匹配。dao是不同的,如果我对两个不同的bean使用@Qualifiers,则功能可以按预期工作。 这是一个更简洁的版本。我没有考虑

  • 我是JPA新手。目前,我正在编写一个带有注释的本机查询。我有一个类似下面的类 我正在编写两个查询,其中一个查询在选择投影中包含字段2,而另一个不包含字段2。如何对这两个查询使用相同的类?我尝试了瞬态注释。但它使两个查询的值都为null。

  • 因此,上述结构在ClassA中也同样存在。 假设我想编码2个其他类ClassC(使用ClassA的实例)和ClassD(使用ClassB的实例)。除了ClassA和ClassB的实例之外,ClassC和ClassD的代码完全相同。 从示例中可以看出,ClassC和ClassD具有相同的功能,但对tmp使用了不同的类

  • null 如何使用Spring Batch配置JTA/XA事务(Atomikos)?

  • 问题内容: 在JPA中,我有2个实体:Entry和Comment。条目包含两个Comment对象集合。 为了存储此类对象,JPA + Hibernate创建“ Entry”表,“ Comment”表和单个“ Entry_Comment”: 对象的存储失败,并且不能同时为“非null”。 如何使用JPA + Hibernate存储包含两个相同类型的集合的对象? 问题答案: 这是许多Hibernate