![](/img/trans.png)
[英]Why can't we autowire an abstract class inside a concrete class in Spring?
[英]How to specify which version of a concrete implementation for an abstract class to autowire in Spring?
具有以下類結構:
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 A
具體的類在我的Foo服務中基於屬性文件中的屬性來Autowire
。
@Service
public class Foo {
@Autowire
private A assignMeAConcreteClass;
}
在我的properties
文件中,我有這個:
should-Aa-be-used: {true, false}
刪除@Service
注釋,而是在讀取屬性的配置類中編寫@Bean
-annotated方法 ,並返回相應的A
實例。
不是一種新的方式,但在你的情況下,我認為一種可能的合適方式是在想要有條件地注入bean的類中使用FactoryBean
。
這個想法很簡單:通過使用要注入的bean的接口FactoryBean
進行參數化來實現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實例不是經典bean。 您必須專門配置它。
您可以通過以下方式在Spring Java配置中配置它:
@Configuration
public class FactoryBeanAConfiguration{
@Bean(name = "factoryBeanA")
public FactoryBeanA factoryBeanA() {
return new FactoryBeanA();
}
@Bean
public beanA() throws Exception {
return factoryBeanA().getObject();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.