2009-06-18 80 views
5

解決方法:不,我不再延長原始父級。我可以使用@Autowire註解繼承的最終財產嗎?

原創:
有沒有一種方法來註釋一個繼承的final setter方法?我正在擴展一個有final二傳手的課程,我想用@Autowire與Spring。父類來自庫,不能修改。

我發現的解決方法是編寫一個代理方法,但是這看起來像是比必要的更多的工作。

public abstract class SqlMapClientDaoSupport ... { 
    public final void setSqlMapClient(SqlMapClient smc) { 
     ... 
    } 
} 

@Component 
public class AccountDao extends SqlMapClientDaoSupport { 
    // all this just to annotate an existing method? 
    @Autowire 
    public final void setSqlMapClientWorkaround(SqlMapClient smc) { 
     super.setSqlMapClient(smc); 
    } 
} 

編輯1:以上示例修改以反映用例:
用例正在執行DAO對象爲iBATIS /彈簧 延伸的共同base class。每個DAO需要相同的 屬性集,並且每個DAO都需要配置爲一個bean。我目前 通過在applicationContext.xml中單獨配置每一個來完成此操作。

<bean id="accountDAO" 
    class="com.example.proj.dao.h2.AccountDAOImpl" 
    p:sqlMapClient-ref="sqlMapClient" /> 
<bean id="companyDAO" 
    class="com.example.proj.dao.h2.CompanyDAOImpl" 
    p:sqlMapClient-ref="sqlMapClient" /> 
<!-- etc... --> 

我寧願使用組件掃描自動發現並自動裝配的DAO 對象,我不能複製/粘貼誤事。

<context:component-scan base-package="com.example.proj.dao.h2" /> 

我沒有在annotation guide看到一個如何詮釋不到哪裏聲明以外的 屬性/成員。我希望這是 但我錯過了。

編輯2:我不再延長SqlMapClientDaoSupport類,而不是我的AccountDao是實現什麼正在支持類提供什麼功能的POJO。這使我可以隨意使用@Autowire。

+0

當你嘗試時會發生什麼? – skaffman 2009-06-18 10:35:22

+0

在沒有在子類中重新聲明它的情況下,如何在超類上註解方法的語法是? – Chadwick 2009-06-18 20:27:11

回答

0

沒有,有沒有辦法詮釋繼承的最終方法。

我沒有擴展支持類(SqlMapClientDaoSupport),而是在我的項目中重新實現了它(它的行爲是最小的),根據需要註釋方法,並且我的DAO擴展了該支持類。

2

您是否嘗試過使用xml進行配置?因爲它是一個看起來不能更改的現有類,所以它是使用xml進行配置的明確候選者。然後,你可以指定它爲自動連接」,甚至配置在XML屬性。

+0

是的,我可以在applicationConfig.xml中配置MyClass。使用@Autowire的願望 是因爲相同包中的幾個類每個 都需要相同的屬性集。我更新了原始問題 – Chadwick 2009-06-18 20:28:25

0

這聽起來像你對我不應該試圖建立一個最終場。

通常有一個很好的理由字段是最後的。

你有沒有設置一個對象的SqlMapClientFactoryBean?

見​​

0

你可以用params創建一個新的構造函數,用於所有最終的構造函數,然後調用構造函數中的setter。