如何指定要在 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 到 Autowire
在 properties 文件中的 属性 上。
@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();
}
}
具有以下 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 到 Autowire
在 properties 文件中的 属性 上。
@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();
}
}