2009-06-18 4 views
5

解決策:いいえ、もはや元の親を拡張していません。継承された最終プロパティに@Autowireを使用して注釈を付けることはできますか?

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

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

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は同じ プロパティセットを必要とし、それぞれを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 オブジェクトを発見し、autowireするコンポーネント・スキャンを使用することを好むだろう。

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

私は1つが宣言場所以外の プロパティ/メンバーに注釈を付けるだろうかannotation guideには表示されません。私はそれが 何か私は欠けていることを望んでいる。

は編集2:私は、もはやSqlMapClientDaoSupportクラスを拡張していますは、代わりに私のAccountDaoは少し機能がサポートクラスによって提供されていたものを実装してPOJOです。これにより私は@Autowireを自由に使うことができます。

+0

試してみるとどうなりますか? – skaffman

+0

サブクラスで再宣言することなく、スーパークラスのメソッドにアノテーションを付ける構文は何ですか? – Chadwick

答えて

0

を参照してください。

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

2

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

+0

はい、applicationConfig.xmlでMyClassを設定できます。欲望 @Autowireを使用するのは同じパッケージ内の複数のクラスがそれぞれ の同じプロパティセットを必要とするためです。元の質問を更新しました – Chadwick

+1

"抽象" Bean定義を使用して調べることができます。少なくとも、すべてのBeanでプロパティを宣言する必要はありません。必要なのは、そのBeanを親Beanとして参照することだけです。注釈アプローチを使用する際の問題は、ソースコードにアクセスする必要があることです。 –

+0

コメントの解決方法は+1。 – Chadwick

0

あなたが最後のフィールドを設定しようとすべきではないようですが、私には聞こえる。

正当な理由が通常ありますフィールドは最終的なものである。

はあなたのセットアップSqlMapClientFactoryBeanオブジェクトをお持ちですか?

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

+0

フィールドは最終的なもので、設定を妨げるものではなく、動作のオーバーライドを防ぐためのものです。 @Autowiredを使ってSpringに渡すようにしようとしていたのは、私のSqlMapClientFactoryBeanです。 – Chadwick

0

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

関連する問題