74

@NoRepositoryBeanSpring Data のドキュメントを読んでいるときに、このインターフェースに何度か遭遇しました。

ドキュメントから引用するには:

Spring 名前空間を使用して自動リポジトリ インターフェイス検出を使用している場合、インターフェイスをそのまま使用すると、Spring は MyRepository のインスタンスを作成しようとします。もちろん、これは望ましくありません。リポジトリと、各エンティティに対して定義する実際のリポジトリ インターフェイスとの間の仲介者として機能するだけだからです。リポジトリを拡張するインターフェイスがリポジトリ インスタンスとしてインスタンス化されないように除外するには、 で注釈を付けます@NoRepositoryBean

ただし、いつ、どこで使用するかはまだわかりません。誰かがアドバイスして、具体的な使用例を教えてもらえますか?

4

2 に答える 2

159

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

メソッド foo() をすべてのリポジトリに追加したいとします。このようなレポインターフェースを追加することから始めます

public interface com.foobar.MyBaseInterface<…,…&gt; extends CrudRepository<…,…&gt; {

  void foo();
}

対応する実装クラス、ファクトリなども追加します。具体的なリポジトリ インターフェイスは、その中間インターフェイスを拡張します。

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

}

ここで、次のようにブートストラップするとします (Spring Data JPA としましょう)。

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

同じパッケージに入ってcom.foobarいるので使えます。CustomerRepositorySpring Data インフラストラクチャにはMyBaseRepository、 が具体的なリポジトリ インターフェイスではなく、追加のメソッドを公開するための中間リポジトリとして機能することを伝える方法がなくなりました。そのため、リポジトリ プロキシ インスタンスを作成しようとして失敗します。この中間インターフェースにアノテーションを付けて、本質的に Spring Data に伝えることができるよう@NoRepositoryBeanになりました: このインターフェースのリポジトリ プロキシ Bean を作成しないでください。

そのシナリオも理由CrudRepositoryでありPagingAndSortingRepository、この注釈も付けています。パッケージのスキャンが誤ってそれらを拾った場合 (誤ってこのように構成したため)、ブートストラップは失敗します。

簡単に言えば、注釈を使用して、リポジトリ インターフェースが最終的にリポジトリ Bean インスタンスになる候補として選択されるのを防ぎます。

于 2012-07-20T19:29:49.457 に答える
2

カスタムメソッドとして新しいインターフェースを宣言できます。

@NoRepositoryBean
public interface ExtendedRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    List<T> findByAttributeContainsText(String attributeName, String text);
}

私たちのインターフェースは JpaRepository インターフェースを拡張しているため、すべての標準的な動作から恩恵を受けることができます。

@NoRepositoryBean アノテーションを追加したことにも気付くでしょう。そうしないと、Spring のデフォルトの動作は、Repository のすべてのサブインターフェースの実装を作成することになるため、これが必要です。

public interface ExtendedStudentRepository extends ExtendedRepository<Student, Long> {
}
于 2020-07-28T06:32:51.137 に答える