簡體   English   中英

Spring和Abstract類 - 在抽象類中注入屬性

[英]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" />

我也試過這些其他參考資料來找到解決方案:

  1. http://www.captaindebug.com/2011/06/implementing-springs-factorybean.html#.WqF5pJPwaAN
  2. http://forum.spring.io/forum/spring-projects/container/46815-problem-with-autowired-in-abstract-class
  3. https://github.com/cavallefano/Abstract-Factory-Pattern-Spring-Annotation
  4. http://www.jcombat.com/spring/factory-implementation-using-servicelocatorfactorybean-in-spring
  5. https://www.madbit.org/blog/programming/1074/1074/#sthash.XEJXdIR5.dpbs
  6. 使用Spring框架的抽象工廠
  7. Spring Autowiring不適用於抽象類
  8. 在抽象超類中注入spring依賴項
  9. 在抽象類中定義的Spring autowire依賴項
    1. Spring可以在抽象類中自動裝配嗎?

請嘗試使用**@Configurable(dependencyCheck = true)**並更新此帖子,如果您遇到任何問題,我可以嘗試幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM