如何指定要在 Spring 中自动装配的抽象 class 的具体实现版本?

How to specify which version of a concrete implementation for an abstract class to autowire in Spring?

具有以下 class 结构:

public abstract class A {
    String someProperty = "property"

    public abstract void doSomething();
}

@Service
public class Aa extends A {

    @Override
    public abstract void doSomething() {
        System.out.println("I did");
    }
}

@Service
public class Ab extends A {

    @Override
    public abstract void doSomething() {
        System.out.println("I did something else");
    }
}

我需要一种方法来告诉 Spring 在我的 Foo 服务中哪个 A 具体 class 到 Autowireproperties 文件中的 属性 上。

@Service
public class Foo {

    @Autowire
    private A assignMeAConcreteClass;
}

在我的 properties 文件中我有这个:

should-Aa-be-used: {true, false}

删除 @Service 注释,而是在读取属性的配置 class 中写入 @Bean-annotated method,并 returns 适当的 A 实例。

不是新方法,但在你的情况下,我认为可能合适的方法是使用 FactoryBean 中想要有条件地注入 bean 的 class。
这个想法很简单:您通过使用要注入的 bean 的接口对其进行参数化来实现 FactoryBean 并覆盖 getObject() 以注入希望的实现:

public class FactoryBeanA  implements FactoryBean<A> {   

    @Autowired
    private ApplicationContext applicationContext;

    @Value("${should-Aa-be-used}")
    private boolean shouldBeUsed;

    @Override
    public A getObject() {

        if (shouldBeUsed) {
            return applicationContext.getBean(Aa.class));

        return applicationContext.getBean(Ab.class));

    }
}

但 FactoryBean 实例不是 classic bean。你必须专门配置它。

您可以这样在 Spring Java 配置中配置它:

@Configuration
public class FactoryBeanAConfiguration{

    @Bean(name = "factoryBeanA")
    public FactoryBeanA factoryBeanA() {
         return new FactoryBeanA();
    }

    @Bean
    public beanA() throws Exception {
        return factoryBeanA().getObject();
    }
}