[英]Spring and Abstract class - injecting properties in abstract classes
我有一個抽象的基類,有一個名為“mailserver”的屬性,我希望從spring ioc容器中注入。 但是,當我運行抽象類的混凝土實現時,我得到了mailserver屬性的null。
這樣做的正確方法是什么? 你有沒有試過這樣做並取得成功? 請分享。
使用abstract
屬性將抽象基類定義標記為抽象,並在具體類定義中,使parent
屬性成為抽象類的bean名稱的名稱
像這樣的東西:
<bean id="abstractBaseClass" abstract="true" class="pacakge1.AbstractBaseClass">
<property name="mailserver" value="DefaultMailServer"/>
</bean>
<bean id="concreteClass1" class="pacakge1.ConcreteClass1" parent="abstractBaseClass">
<!--Override the value of the abstract based class if necessary-->
<property name="mailserver" value="AnotherMailServer"/>
</bean>
超類中的屬性(抽象與否)與Spring中的任何其他屬性完全相同。 您可以使用基於XML,注釋或Java配置的setter,構造函數或字段注入。 您將在Spring中找到廣泛使用的繼承:例如, DefaultMessageListenerContainer 。 展示你是如何嘗試連接財產的,有人可以解釋為什么它不起作用。
在我的例子中,在Spring4應用程序中,我不得不使用經典的抽象工廠模式(我從這里獲取了這個想法 - http://java-design-patterns.com/patterns/abstract-factory/ )來創建每個實例每次都要進行操作。所以我的代碼設計如下:
public abstract class EO {
@Autowired
protected SmsNotificationService smsNotificationService;
@Autowired
protected SendEmailService sendEmailService;
...
protected abstract void executeOperation(GenericMessage gMessage);
}
public final class OperationsExecutor {
public enum OperationsType {
ENROLL, CAMPAIGN
}
private OperationsExecutor() {
}
public static Object delegateOperation(OperationsType type, Object obj)
{
switch(type) {
case ENROLL:
if (obj == null) {
return new EnrollOperation();
}
return EnrollOperation.validateRequestParams(obj);
case CAMPAIGN:
if (obj == null) {
return new CampaignOperation();
}
return CampaignOperation.validateRequestParams(obj);
default:
throw new IllegalArgumentException("OperationsType not supported.");
}
}
}
@Configurable(dependencyCheck = true)
public class CampaignOperation extends EO {
@Override
public void executeOperation(GenericMessage genericMessage) {
LOGGER.info("This is CAMPAIGN Operation: " + genericMessage);
}
}
最初為了在抽象類中注入依賴項,我嘗試了所有構造型注釋,如@ Component,@ Service等,但即使Spring上下文文件具有整個包的ComponentScanning,但不知何故在創建Subclasses的實例時,如CampaignOperation,Super Abstract類EO是由於spring無法識別並注入其依賴項,因此其屬性為null。經過多次試驗和錯誤后,我使用了這個**@Configurable(dependencyCheck = true)**
注釋,最后Spring能夠注入依賴項,我能夠使用子類中的屬性而不會使它們與太多屬性混淆。
<context:annotation-config />
<context:component-scan base-package="com.xyz" />
我也試過這些其他參考資料來找到解決方案:
請嘗試使用**@Configurable(dependencyCheck = true)**
並更新此帖子,如果您遇到任何問題,我可以嘗試幫助您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.