Maison >Java >javaDidacticiel >Quelle est la méthode de proxy dynamique par défaut de SpringBoot/Spring AOP ?

Quelle est la méthode de proxy dynamique par défaut de SpringBoot/Spring AOP ?

王林
王林avant
2023-05-10 15:52:183203parcourir

1. springboot 2.x et supérieur

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.

Quelle est la méthode de proxy dynamique par défaut de SpringBoot/Spring AOP ?

2 Springboot 1.x

Springboot 1.x AOP utilise toujours le proxy dynamique JDK par défaut

Quelle est la méthode de proxy dynamique par défaut de SpringBoot/Spring AOP ?

3.SpringBoot 2.x Pourquoi. Cglib est-il utilisé par défaut ? Le proxy dynamique JDK étant basé sur des interfaces, les objets générés par le proxy ne peuvent être affectés qu'à des variables d'interface. Le proxy dynamique JDK utilise Proxy.newProxyInstance() pour créer une classe d'implémentation de proxy. Cependant, le deuxième paramètre nécessite un type d'interface. S'il n'y a pas de type d'interface, une erreur sera signalée.

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

Quelle est la méthode de proxy dynamique par défaut de SpringBoot/Spring AOP ?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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer