6

context.xmlにBeanが追加されないように、@Repositoryのスプリングアノテーションを使用したいと思います。私はibatis統合を使用しているので、私のリポジトリクラスは次のようになります

@Repository("userDao")
public class UserDaoMybatis extends SqlMapClientDaoSupport implements UserDao {
    // ...
}

SqlMapClientDaoSupport(春のライブラリクラス)には、@Autowiredまたは@Resourseで注釈が付けられていない必須プロパティを設定するためのfinalメソッドがあります

public final void setSqlMapClient(SqlMapClient sqlMapClient) {
    if (!this.externalTemplate) {
        this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient);
    }
}

SqlMapClient Beanは、Springcontext.xmlで定義されています。userDao BeanがXMLで定義されている場合は正常に機能しますが、@ Repositoryアノテーションを配置してBean宣言を削除すると、次の例外が発生します。

java.lang.IllegalArgumentException: Property 'sqlMapClient' is required

回避策は、次のような新しいメソッドを追加することです。

@Aitowired
injectSqlMapClient(SqlMapClient sqlMapClient) {
    setSqlMapClient(sqlMapClient);
}

しかし、それは醜いように見えます

定義せずにプロパティを注入する他の方法はありますか?

4

1 に答える 1

3

中間スーパークラスを導入してみませんか?

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport {

   @Autowired
   injectSqlMapClient(SqlMapClient sqlMapClient) {
      setSqlMapClient(sqlMapClient);
   }
}

その後

@Repository("userDao")
public class UserDaoMybatis extends AutoringSqlMapClientDaoSupport implements UserDao {
    // ...
}

はい、それは継承の乱用ですが、既存のものより悪くはありませSqlMapClientDaoSupportん。DAOクラス自体のインジェクションフックを避けたいのであれば、これ以上の方法は考えられません。

于 2010-09-27T20:58:33.280 に答える