5

解決策:いいえ、元の親を拡張していません。

オリジナル:継承されたセッターメソッド
に注釈を付ける方法はありますか?Springでやりたいセッターのあるfinalクラスを拡張しています。親クラスはライブラリからのものであり、変更できません。final@Autowire

私が見つけた回避策はプロキシメソッドを作成することですが、これは必要以上の作業のようです。

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:ユースケースを反映するように変更された上記の例:ユースケースは、共通の基本クラス
を拡張するIbatis/Springの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" />

注釈ガイドには、宣言されている場所以外でプロパティ/メンバーに注釈を付ける方法がわかりません。私はそれが私が欠けているものであることを望んでいます。

編集2: SqlMapClientDaoSupportクラスを拡張しなくなりました。代わりに、AccountDaoはPOJOであり、Supportクラスによって提供されていたほとんどの機能を実装していません。これにより、@Autowireを自由に使用できます。

4

4 に答える 4

2

xmlで構成しようとしましたか?変更できないように見える既存のクラスであるため、xml で構成するための明確な候補です。次に、それを autowire として指定するか、xml でプロパティを構成することもできます。

于 2009-06-18T10:44:32.037 に答える
0

最終的なすべてのセッターとコンストラクターのパラメーターを使用して新しいコンストラクターを作成し、コンストラクターで@Autowiredセッターを呼び出すことができます。

于 2010-02-11T23:28:11.393 に答える
0

最終的なフィールドを設定しようとしてはいけないように思えます。

通常、フィールドが final であるには十分な理由があります。

SqlMapClientFactoryBean オブジェクトをセットアップしましたか?

ヘルプはこちら

于 2009-06-22T11:28:01.410 に答える
0

いいえ、継承された final メソッドに注釈を付ける方法はありません。

サポート クラス ( ) を拡張するのではなく、SqlMapClientDaoSupport必要に応じてメソッドに注釈を付けてプロジェクトに再実装し (動作は最小限です)、DAO はそのサポート クラスを拡張します。

于 2009-09-15T04:07:56.850 に答える