Dans une application Spring, sauf exceptions, les Beans sont proxifiés. En d’autres mots, on n’interagit pas directement avec eux et ce mécanisme est à la base de l’AOP.
Beaucoup de mécanismes s’appuient sur l’AOP (les Transactions par exemple) et connaître la façon dont sont proxifiés les beans est important pour prédire et comprendre certains comportements.
La documentation Spring est très claire sur la question:
If the target object to be proxied implements at least one interface, a JDK dynamic proxy is used. All of the interfaces implemented by the target type are proxied. If the target object does not implement any interfaces, a CGLIB proxy is created.
Quand, dans mon application Spring Boot j’avais mon Bean proxifié par CGLIB alors qu’il implémentait une interface, j’ai donc cru à une erreur mais que nenni !
Dans une application Spring Boot, depuis Spring Boot 2, c’est CGLIB qui est utilisé en priorité, même quand un Bean implémente une interface ! Attention donc si vous annotez @Transactionnal sur une méthode final (vous n’aurez pas d’erreur mais la transaction ne s’effectuera pas).
Avoir le même comportement qu’une application Spring classique
Si vous souhaitez avoir les mêmes règles que dans une application Spring classique, dans votre application.properties, ajoutez la ligne suivante:
spring.aop.proxy-target-class=false
Astuces
Vous pouvez utiliser
AopUtils.isCglibProxy(monBean);
Ou
AopUtils.isJdkDynamicProxy(monBean);
Pour savoir quel proxy est utilisé.
Vous pouvez bien évidemment utiliser le débugger pour vous en rendre compte également.
Prérequis
Il faut que vous ayez déjà installé un JDK. Exécutez la commande:
java --version
Si vous avez bien un output de ce type avec cette commande, vous pouvez continuer.
Dans le cas contraire, il faudra installer un JDK.
Installation de Maven
Aller sur la page https://dlcdn.apache.org/maven/maven-3/
Sélectionnez le dossier corres...
Introduction
Il est très commun d’utiliser les transactions Spring dans nos projets, il est donc important de savoir quand celles-ci altéreront notre base de données.
On va voir via des exemples ce qui déclenche un rollback et comment customiser ce...
Introduction
Sur un des projets sur lesquels j’interviens, diverses personnes ont contribué au cours des années parfois sans passation entre les équipes.
En regardant les commits, on voit qu’une équipe a mis un ORM, une autre l’a enlevé, ...
Introduction
Vous avez diagnostiqué une fuite mémoire et vous voulez corriger le problème.
Si vous utilisez IntelliJ, vous avez à disposition dans votre IDE un outil puissant qui vous permettra de diagnostiquer la source du problème et vérifier vot...