Cglib sera utilisé par défaut dans SpringBoot 2.x AOP, mais le proxy dynamique jdk est toujours utilisé par défaut dans Spring5. Spring AOP utilise le proxy dynamique JDK par défaut. Si l'objet n'implémente pas l'interface, le proxy CGLIB est utilisé. Bien entendu, il est également possible de forcer l’utilisation d’un proxy CGLIB.
Dans SpringBoot, AOP est automatiquement assemblé via AopAutoConfiguration.
Springboot 1.x AOP utilise toujours le proxy dynamique JDK par défaut
Proxy.newProxyInstance(iCustomerInstance.getClass().getClassLoader(), iCustomerInstance.getClass().getInterfaces(), this);
CGLIB n'a pas ce problème. Étant donné que CGLIB est implémenté en générant des sous-classes, que l'objet proxy soit affecté à une interface ou à une classe d'implémentation, les deux sont les classes parentes de l'objet proxy.
Ainsi, dans la version 2.x et supérieure, l'implémentation par défaut d'AOP est remplacée par le proxy CGLIB.
Créez une nouvelle interface
public interface ICustomService { void printf(); }
Créez une nouvelle classe d'implémentation de ICustomService
@Service public class CustomServiceImpl implements ICustomService { public void printf() { } }
Ajoutez une autre classe qui n'implémente aucune interface
@Service public class CustomNoImpl { public void hello() { } }
Puis commencez, vous pouvez voir à partir de ICustomService et CustomNoImpl que l'agent AOP utilise l'agent dynamique de CGLIB
Ensuite, nous définissons le proxy sur le proxy JDK par défaut via la configuration application.properties.
spring.aop.proxy-target-class=false
Ensuite, j'ai commencé le débogage et j'ai découvert que CustomNoImpl utilise le proxy généré par CGLIB car il n'implémente pas l'interface, tandis que
customService a une implémentation d'interface, il utilise donc le proxy dynamique de JDK
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!