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.
On va voir comment avoir en quelques minutes des assertions qui vont vérifier les endpoints de notre API avec des scénarios de ce genre:
Feature: Create a new account
As a visitor,
I can create an account to access the game
Scenario: A visitor creates an account
When I fill the login form with
| email | password |
| [email protected] | Jh0...
Depuis .NET 9, le le support d’OpenAPI est directement inclus dans .NET et ne passe plus par les librairies Swagger par défaut (plus d’info sur ce choix ici si jamais ça vous intéresse).
De façons simplifiée, la librairie Swashbuckle.AspNetCore.Sw...
Description du problème
Par défaut, il n’est pas autorisé de faire des requêtes entre une application qui est dans un domaine A vers une autre qui serait dans un domaine B (pour des raisons de sécurité, il y a plus de détails dans les sources).
S...
On va créer pas-à-pas un raccourci qui nous permettra de générer un IBAN et de l’insérer à l’endroit où se trouve notre curseur. Si vous n’avez pas fait le setup pour développer un plugin Jetbrains, je vous invite à lire notre article sur le sujet.
...