5

私は次のコードを持っています -

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を使用してこれを実行できることはすでに知っています。注釈のみを使用して実行できる最善の方法を知りたいです。

4

4 に答える 4

1

Spring の Hibernate サポートを使用するときに、似たようなものを検索しました。必要なメソッドをサブクラス化してオーバーライドすることなく、スーパークラスに配線を追加 (または変更) する方法はありません。または、 XML を介して必要なプロパティの参照値をサブクラス化し、提供する宣言型アプローチ。

「醜い」ものではないものは、おそらく透明性が低くなります。したがって、Zutty が提案するソリューションは、各 Dao 実装でオーバーライドする必要がなくなるため、ここに最適です。

于 2013-05-24T12:21:24.193 に答える
0

クラスが機能するために必要な場合 (そしておそらく DAO 内にある場合)、プロパティではなくコンストラクター引数にする必要があります。自動配線しているため、どちらも必要ありません。親で保護し、自動配線します。あなたの子供はそれへの参照を持っています。

于 2013-05-24T21:53:46.327 に答える
0

これは、xml 構成を使用して透過的に行うことができます。注釈を使用したい場合は、今のように super を呼び出すのがおそらく最善の方法です。

于 2013-05-24T11:06:22.563 に答える