注釈は、実際にはリポジトリインタフェースの基準と一致するが、それが意図されていないインタフェースのリポジトリプロキシを作成しないようにするために使用されます。すべてのリポジトリを機能拡張し始めた後にのみ必要です。例を挙げてみましょう:
すべてのリポジトリに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を作成しないでください。
このシナリオはまた、CrudRepository
とPagingAndSortingRepository
もこの注釈を保持します。あなたが誤ってこのように設定してしまったため、パッケージスキャニングが偶然にそれらを選択すると、ブートストラップが失敗します。
短い説明:アノテーションを使用すると、最終的にリポジトリBeanインスタンスとして最終的に終わる候補としてリポジトリインタフェースが選択されなくなります。
この説明をお寄せいただきありがとうございます。 – balteo
スーパー回答。ありがとうございます。 – ozgur
うまく説明した答え。 – Mukti