web-dev-qa-db-ja.com

Spring Data JPA @NoRepositoryBeanインターフェースについて

@NoRepositoryBean Spring Dataのドキュメントを読みながら、数回インターフェースします。

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

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

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

49
balteo

アノテーションは、実際にはレポインターフェースの基準に一致するが、そのためのものではないインターフェースのリポジトリプロキシの作成を回避するために使用されます。必要なのは、機能を備えたすべてのリポジトリの拡張を開始した場合のみです。例を挙げましょう。

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

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

  void foo();
}

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

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

}

bootstrap-Spring Data JPAを例にとると-次のようになります:

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

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

このシナリオは、CrudRepositoryPagingAndSortingRepositoryがこの注釈を同様に保持する理由でもあります。パッケージスキャンが偶然にそれらを拾った場合(誤ってこの方法で構成したため)、bootstrapは失敗します。

簡単に言えば、アノテーションを使用して、リポジトリインターフェースが最終的にリポジトリBeanインスタンスになる候補として選択されないようにします。

115
Oliver Drotbohm