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 ?

王林
Libérer: 2023-05-10 15:52:18
avant
3199 Les gens l'ont consulté

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);
Copier après la connexion

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();
}
Copier après la connexion

Créez une nouvelle classe d'implémentation de ICustomService

@Service
public class CustomServiceImpl implements ICustomService {
 
    public void printf() {
 
    }
}
Copier après la connexion

Ajoutez une autre classe qui n'implémente aucune interface

@Service
public class CustomNoImpl {
 
    public void hello() {
        
    }
}
Copier après la connexion

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
Copier après la connexion

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!

source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal