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:
- 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é.
- 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
.
- 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.