web-dev-qa-db-fra.com

Comprendre l'interface Spring Data JPA @NoRepositoryBean

J'ai rencontré le @NoRepositoryBean interface plusieurs fois lors de la lecture de la documentation Spring Data.

Pour citer la documentation:

Si vous utilisez la détection automatique de l'interface de référentiel en utilisant l'espace de noms Spring en utilisant l'interface telle quelle, Spring tentera de créer une instance de MyRepository. Ceci n'est bien sûr pas souhaité car il agit simplement comme intermédiaire entre le référentiel et les interfaces de référentiel réelles que vous souhaitez définir pour chaque entité. Pour exclure une interface étendant Repository d'être instanciée en tant qu'instance de référentiel, annotez-la avec @NoRepositoryBean.

Cependant, je ne sais toujours pas quand et où l'utiliser. Quelqu'un peut-il me conseiller et me donner un exemple concret d'utilisation?

49
balteo

L'annotation est utilisée pour éviter de créer des proxys de référentiel pour des interfaces qui correspondent réellement aux critères d'une interface de référentiel mais qui ne sont pas censées en être une. Il n'est nécessaire que lorsque vous commencez à étendre tous les référentiels avec des fonctionnalités. Laisse moi te donner un exemple:

Supposons que vous souhaitez ajouter une méthode foo () à tous vos référentiels. Vous commenceriez par ajouter une interface repo comme celle-ci

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

  void foo();
}

Vous ajouteriez également la classe d'implémentation, la fabrique et ainsi de suite. Vos interfaces de référentiel concrètes étendent maintenant cette interface intermédiaire:

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

}

Supposons maintenant que vous bootstrap - disons Spring Data JPA - comme suit:

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

Tu utilises com.foobar car vous avez CustomerRepository dans le même package. L'infrastructure Spring Data n'a désormais aucun moyen de dire que le MyBaseRepository n'est pas une interface de référentiel concrète mais agit plutôt comme un référentiel intermédiaire pour exposer la méthode supplémentaire. Il essaierait donc de créer une instance de proxy de référentiel pour cela et échouerait. Vous pouvez maintenant utiliser @NoRepositoryBean pour annoter cette interface intermédiaire pour dire essentiellement à Spring Data: ne créez pas de bean proxy de référentiel pour cette interface.

Ce scénario est également la raison pour laquelle CrudRepository et PagingAndSortingRepository portent également cette annotation. Si l'analyse du package les récupérait par accident (parce que vous l'avez accidentellement configuré de cette façon), le bootstrap échouerait).

Pour faire court: utilisez l'annotation pour empêcher que les interfaces de référentiel soient sélectionnées comme candidats pour finir par devenir des instances de bean de référentiel.

115
Oliver Drotbohm