簡體   English   中英

使用Spring注釋注入父類依賴項的正確方法

[英]Proper way to inject parent class dependencies with Spring annotations

我有以下代碼 -

Dao.java

@Component
public class Dao extends NamedParameterJdbcDaoSupport {

}

dbContext.xml

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${db.driver}" />
            <property name="url" value="${db.jdbc.url}" />
            <property name="username" value="${db.user}" />
            <property name="password" value="${db.password}" />
        </bean>

applicationContext.xml中

<context:component-scan base-package="com.kshitiz" />

問題是NamedParameterJdbcDaoSupport需要數據源才能工作。 既然這是超類的屬性而不是我自己的類,我能想到的唯一方法就是 -

@Component
public class Dao extends NamedParameterJdbcDaoSupport {
    @Autowired
    public void setDataSource(DataSource dataSource) {
        super.setDataSource(dataSource);
    }
}

這非常難看。 我可以指定我想要自動裝配我的bean的所有屬性嗎? 就像是 -

@Component(default-autowire="byType")
public class Dao extends NamedParameterJdbcDaoSupport {

}

這在春天有可能嗎? 或者,注入超類依賴項的最優雅方法是什么?

編輯:我已經知道這可以使用我目前正在使用的XML來完成。 我想知道僅使用注釋可以做到的最好。

不一定是你要找的答案,但我會用中級超級班做這個。

public abstract class AbstractDao extends NamedParameterJdbcDaoSupport {
    @Autowired
    public void setDataSource(DataSource dataSource) {
        super.setDataSource(dataSource);
    }
}

@Component
public class Dao extends AbstractDao {
}

在使用Spring的Hibernate支持時,我搜索了類似的東西。 沒有子類化並覆蓋所需方法,就無法在超類中添加(或更改)布線。 value for the desired properties via XML. 或者通過XML子類化並為所需屬性提供值的聲明性方法。

任何不那么“丑陋”的東西都可能不太透明。 所以Zutty提出的解決方案最適合這里,因為它消除了在每個Dao實現中覆蓋的需要。

這可以使用xml配置透明地完成。 如果你想使用注釋,像現在這樣調用super可能是最好的方法。

如果您的類需要工作(並且它可能在DAO中),那么它應該是構造函數參數而不是屬性。 既然你是自動裝配,你也不需要。 使其在父級中受到保護並自動裝配它。 你的孩子會參考它。

暫無
暫無

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

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