# 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_

---
## D'abord la spec OAS

---
## Exemple d'interface générée d'un controlleur

---
## 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
- 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

---
## 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_

---
## Configuration

---
## Configuration

---
## Implémentation contrôleur générique

---
## Implémentation contrôleur générique

---
## 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

MERCI !
:pray:
{"description":"View the slide with \"Slide Mode\".","contributors":"[{\"id\":\"97bffc1a-181f-4ccb-956c-fb0fdc5fa2b9\",\"add\":6731,\"del\":3241}]","title":"Talk slides template"}