注釈は、実際にはリポジトリ インターフェースの基準に一致するが、1 つになることを意図していないインターフェースのリポジトリ プロキシの作成を回避するために使用されます。すべてのリポジトリを拡張して機能を拡張する場合にのみ必要です。例を挙げましょう:
メソッド foo() をすべてのリポジトリに追加したいとします。このようなレポインターフェースを追加することから始めます
public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {
void foo();
}
対応する実装クラス、ファクトリなども追加します。具体的なリポジトリ インターフェイスは、その中間インターフェイスを拡張します。
public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> {
}
ここで、次のようにブートストラップするとします (Spring Data JPA としましょう)。
<jpa:repositories base-package="com.foobar" />
同じパッケージに入ってcom.foobar
いるので使えます。CustomerRepository
Spring Data インフラストラクチャにはMyBaseRepository
、 が具体的なリポジトリ インターフェイスではなく、追加のメソッドを公開するための中間リポジトリとして機能することを伝える方法がなくなりました。そのため、リポジトリ プロキシ インスタンスを作成しようとして失敗します。この中間インターフェースにアノテーションを付けて、本質的に Spring Data に伝えることができるよう@NoRepositoryBean
になりました: このインターフェースのリポジトリ プロキシ Bean を作成しないでください。
そのシナリオも理由CrudRepository
でありPagingAndSortingRepository
、この注釈も付けています。パッケージのスキャンが誤ってそれらを拾った場合 (誤ってこのように構成したため)、ブートストラップは失敗します。
簡単に言えば、注釈を使用して、リポジトリ インターフェースが最終的にリポジトリ Bean インスタンスになる候補として選択されるのを防ぎます。