95 votes

Comment sont le Printemps référentiels de Données mise en œuvre?

J'ai travaillé avec Spring Data JPA référentiel dans mon projet depuis un certain temps et je sais que les points ci-dessous:

  • Dans le référentiel des interfaces, nous pouvons ajouter les méthodes comme findByCustomerNameAndPhone() (en supposant customerName et phone sont des champs dans le domaine de l'objet).
  • Ensuite, Spring fournit la mise en œuvre par la mise en œuvre du référentiel de méthodes d'interface au moment de l'exécution (au cours de l'exécution de l'application).

Je suis intéressé sur la façon dont cela a été codé et j'ai regardé le Printemps JPA code source et les Api, mais je ne pouvais pas trouver les réponses aux questions ci-dessous:

  1. Comment est le référentiel de mise en œuvre de la classe générée lors de l'exécution et les méthodes mises en œuvre et injecté?
  2. N'Spring Data JPA utilisation CGlib ou toutes les bibliothèques de manipulation de bytecode pour mettre en œuvre les méthodes et injecter de façon dynamique?

Pourriez-vous s'il vous plaît aider avec les requêtes et également fournir des documents ?

122voto

Oliver Gierke Points 11630

Tout d'abord, il n'y a pas de génération de code en cours, ce qui signifie: pas de CGLib, aucun octet de génération de code. L'approche fondamentale est qu'un JDK proxy instance est créée par programmation à l'aide du Printemps, ProxyFactory API à l'arrière de l'interface et un MethodInterceptor intercepte tous les appels à l'instance et les itinéraires de la méthode dans les endroits appropriés:

  1. Si le dépôt a été initialisé avec une mesure de mise en œuvre de la partie (voir la partie de la documentation de référence pour plus de détails), et la méthode invoquée est mis en œuvre dans la classe, l'appel est redirigé.
  2. Si la méthode est une méthode de requête (voir DefaultRepositoryInformation de la façon dont est déterminée), le magasin de requête spécifique mécanisme d'exécution des coups de pied dans et exécute la requête déterminé à être exécuté pour que la méthode au démarrage. Pour qu'un mécanisme de résolution qui tente d'identifier explicitement déclaré les requêtes dans différents lieux (à l'aide d' @Query sur la méthode, JPA requêtes nommées) ensuite retomber à la requête de la dérivation à partir du nom de la méthode. Pour le mécanisme de requête de détection, voir JpaQueryLookupStrategy. La logique d'analyse de la requête de dérivation peuvent être trouvés en PartTree. Le magasin spécifique de la traduction dans la requête réelle peut être vu, par exemple, en JpaQueryCreator.
  3. Si aucun des ci-dessus s'appliquent la méthode exécutée doit être mis en œuvre par un magasin de dépôt de la classe de base (SimpleJpaRepository dans le cas de la JPA) et l'appel est acheminé dans une instance de cette.

La méthode de l'intercepteur mise en œuvre de cette logique de routage est - QueryExecutorMethodInterceptor, le haut niveau de la logique de routage peuvent être trouvés ici.

La création de ces procurations sont encapsulées dans un standard basé sur Java Usine modèle de mise en œuvre. Le haut niveau de la création de proxy peuvent être trouvés en RepositoryFactorySupport. Le magasin des implémentations spécifiques puis ajoutez les composants de l'infrastructure ainsi que pour JPA, vous pouvez aller de l'avant et il suffit d'écrire le code comme ceci:

EntityManager em = … // obtain an EntityManager
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
UserRepository repository = factory.getRepository(UserRepository.class);

La raison pour laquelle je mentionne explicitement, c'est qu'il devrait être clair que, dans son cœur, rien de ce code nécessite un Printemps conteneur à exécuter en premier lieu. Il a besoin de Printemps comme une bibliothèque sur le chemin de classe (parce que nous préférons ne pas réinventer la roue), mais est récipient agnostique en général.

Afin de faciliter l'intégration avec DI conteneurs que nous avons bien sûr ensuite construit l'intégration avec Spring Java configuration, un espace de noms XML, mais aussi d'un CDI, d'extension, de sorte que le Printemps de Données peut être utilisé dans la plaine CDI scénarios.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X