# De l'injection de méthodes dans Spring à l'aide de Spring AOP --- ## A propos de - Fabrice Bibonne : support aux développeurs sur les technologies java - Insee : - Produit, analyse et diffuse des informations sur l’économie et la société françaises - Diffuse également des métadonnées comme les référentiels géographiques à travers des API --- ## A propos de - POC de la refonte de _Metadata API_ avec approche contract first : - **la spec OAS est une spécification** - Eviter une génération laborieuse "du swagger" - Documentation fidèle au besoin, au code - Implémentation contrainte _as code_ --- ## Architecture _Metadata API_ ![schema1-fab.drawio](https://hackmd.io/_uploads/BkW78Ybe0.png) --- ## D'abord la spec OAS ![specOAS](https://hackmd.io/_uploads/BkEHIKZgC.png) --- ## Exemple d'interface générée d'un controlleur ![interface](https://hackmd.io/_uploads/ByXIIFblA.png) --- ## Systématiser l'implémentation des controllers Spring - Fonctionnement d'un controlleur (générique) : 1. Appeler la bonne requête Sparql 2. Convertir le résultat dans la bonne entité 3. La retourner - ~~Extensions OpenApi Generator~~ - **Générer l'implémentation au runtime (comme Spring Data)** --- ## Génération par "injection de méthode" - Avec [`MethodReplacer`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/support/MethodReplacer.html) ? - Définition xml seulement - Peu utilisé - Pas compatible avec un contrôle d'accès (`@PreAuthorize`) - Autre chose ? --- ## Spring AOP ! --- ## Spring AOP : ce n'est pas... ![aop](https://hackmd.io/_uploads/BkHPIK-eA.png) --- ## AOP - Programmation orientée Aspect - Paradigme de programmation - On s'intéresse aux aspects transverses de l'application (transactions) - La gestion des aspects est centralisée - On court-circuite les traitements métier pour y insérer les traitements relatifs aux aspects <!--Spring AOP : implémetnation partielle, gestion des transactions, complémentaire de l'inversion de contrôle, très utilisé en interne dans le framework API riche => bon candidat--> --- ## Schéma Spring AOP ![schema3-fab](https://hackmd.io/_uploads/H1LqLYbgR.png) --- ## Implémentation dans Spring _avec la proxyfication_ - [cglib (code generation library)](https://github.com/cglib/cglib?tab=readme-ov-file#cglib-) repackagé par Spring - [Proxy du JDK](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/reflect/Proxy.html) --- ## AOP avec Les contrôleurs de _metadata api_ ![schéma2-fab](https://hackmd.io/_uploads/r1InUtZeC.png) --- ## Configuration ![configuration1](https://hackmd.io/_uploads/H1BALFbeR.png) --- ## Configuration ![confugration2](https://hackmd.io/_uploads/Bkj1DKbgA.png) --- ## Implémentation contrôleur générique ![implControleur1](https://hackmd.io/_uploads/SkfbPFbgR.png) --- ## Implémentation contrôleur générique ![implControlleur2](https://hackmd.io/_uploads/H1HQwY-l0.png) --- ## Ca fonctionne ! --- ## Conclusion - Pistes d'amélioration pour le POC - simplifier la déclaration des _pointcuts_ - Utiliser la réflexion pour associer _endpoints_ et requêtes SPARQL - Spring AOP : - Gérer des aspects génériques dans une application Spring - Très bien intégré avec l'écosystème Spring - Plutôt pour les implémentations internes de Spring mais bon à connaître --- ## Lien ![image](https://hackmd.io/_uploads/ry-GFF-xR.png) MERCI ! :pray:
{"description":"View the slide with \"Slide Mode\".","contributors":"[{\"id\":\"97bffc1a-181f-4ccb-956c-fb0fdc5fa2b9\",\"add\":6731,\"del\":3241}]","title":"Talk slides template"}
    131 views