2012-07-20 8 views
23

Springデータのドキュメントを読んでいる間に、@NoRepositoryBeanインタフェースが何回か遭遇しました。ドキュメントから引用しSpringデータの理解JPA @NoRepositoryBeanインタフェース

:あなたは同じようにインターフェイスを使用して 春の名前空間を使用した自動倉庫インターフェイス検出を使用している場合

はMyRepositoryのインスタンスを作成しようとしている春 の原因となります。これはもちろん、リポジトリと各エンティティに定義したい実際のリポジトリインタフェースの間のインダイドとして機能するので、 は望ましくありません。 リポジトリを拡張するインタフェースを、 リポジトリインスタンスに@NoRepositoryBeanで注釈を付けないようにインスタンス化しないようにします。

ただし、いつどこで使用するかはまだ分かりません。誰かに助言して具体的な使用例を教えてもらえますか?

答えて

77

注釈は、実際にはリポジトリインタフェースの基準と一致するが、それが意図されていないインタフェースのリポジトリプロキシを作成しないようにするために使用されます。すべてのリポジトリを機能拡張し始めた後にのみ必要です。例を挙げてみましょう:

すべてのリポジトリにfoo()メソッドを追加したいとします。

public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> { 

    void foo(); 
} 

また、実装クラスや工場などを追加することもできます。

<jpa:repositories base-package="com.foobar" /> 

を使用すると、同じパッケージにCustomerRepositoryを持っているので、あなたがcom.foobarを使用します。 - - の春データJPAを言わせて、次のように

public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> { 

} 

は今、あなたはブートストラップと仮定します。あなたの具体的なリポジトリのインターフェースは現在、その中間のインターフェイスを拡張します。 Spring Dataインフラストラクチャでは、MyBaseRepositoryが具体的なリポジトリインタフェースではなく、追加のメソッドを公開するための中間リポジトリとして機能することを伝える手段がありません。したがって、リポジトリ・プロキシ・インスタンスを作成して失敗することになります。 @NoRepositoryBeanを使用して、この中間インタフェースに注釈を付けてSpring Dataに伝えることができます。このインタフェース用のリポジトリ・プロキシBeanを作成しないでください。

このシナリオはまた、CrudRepositoryPagingAndSortingRepositoryもこの注釈を保持します。あなたが誤ってこのように設定してしまったため、パッケージスキャニングが偶然にそれらを選択すると、ブートストラップが失敗します。

短い説明:アノテーションを使用すると、最終的にリポジトリBeanインスタンスとして最終的に終わる候補としてリポジトリインタフェースが選択されなくなります。

+3

この説明をお寄せいただきありがとうございます。 – balteo

+0

スーパー回答。ありがとうございます。 – ozgur

+0

うまく説明した答え。 – Mukti

関連する問題