Heim >Java >javaLernprogramm >Was ist die standardmäßige dynamische Proxy-Methode von SpringBoot/Spring AOP?

Was ist die standardmäßige dynamische Proxy-Methode von SpringBoot/Spring AOP?

王林
王林nach vorne
2023-05-10 15:52:183203Durchsuche

1. Springboot 2.x und höher

Cglib wird standardmäßig in SpringBoot 2.x AOP verwendet, aber der dynamische JDK-Proxy wird in Spring5 weiterhin standardmäßig verwendet. Spring AOP verwendet standardmäßig den dynamischen JDK-Proxy. Wenn das Objekt die Schnittstelle nicht implementiert, wird der CGLIB-Proxy verwendet. Natürlich ist es auch möglich, die Verwendung eines CGLIB-Proxys zu erzwingen.

In SpringBoot wird AOP automatisch über AopAutoConfiguration zusammengestellt.

Was ist die standardmäßige dynamische Proxy-Methode von SpringBoot/Spring AOP?

2. Springboot 1.x

Springboot 1.x AOP verwendet standardmäßig immer noch den dynamischen JDK-Proxy

Was ist die standardmäßige dynamische Proxy-Methode von SpringBoot/Spring AOP?

3.SpringBoot 2.x Warum Wird Cglib standardmäßig verwendet? Da der dynamische JDK-Proxy auf Schnittstellen basiert, können die vom Proxy generierten Objekte nur Schnittstellenvariablen zugewiesen werden. Der dynamische JDK-Proxy verwendet Proxy.newProxyInstance(), um eine Proxy-Implementierungsklasse zu erstellen. Der zweite Parameter erfordert jedoch einen Schnittstellentyp. Wenn kein Schnittstellentyp vorhanden ist, wird ein Fehler gemeldet.

Proxy.newProxyInstance(iCustomerInstance.getClass().getClassLoader(), iCustomerInstance.getClass().getInterfaces(), this);

CGLIB hat dieses Problem nicht. Da CGLIB durch Generieren von Unterklassen implementiert wird, sind beide unabhängig davon, ob das Proxy-Objekt einer Schnittstelle oder einer Implementierungsklasse zugewiesen ist, die übergeordnete Klasse des Proxy-Objekts.

In Version 2.x und höher wird die Standardimplementierung von AOP in CGLIB-Proxy geändert.

Erstellen Sie eine neue Schnittstelle.

public interface ICustomService {
    void printf();
}

Erstellen Sie eine neue Implementierungsklasse von ICustomService.

@Service
public class CustomServiceImpl implements ICustomService {
 
    public void printf() {
 
    }
}
.

Fügen Sie eine weitere Klasse hinzu, die keine Schnittstelle implementiert

Dann stellen wir den Proxy über die application.properties-Konfiguration standardmäßig auf den JDK-Proxy ein.

@Service
public class CustomNoImpl {
 
    public void hello() {
        
    }
}

Dann habe ich mit dem Debuggen begonnen und festgestellt, dass CustomNoImpl den von CGLIB generierten Proxy verwendet, weil es die Schnittstelle nicht implementiert, während Was ist die standardmäßige dynamische Proxy-Methode von SpringBoot/Spring AOP?

customService über eine Schnittstellenimplementierung verfügt und daher den dynamischen Proxy von JDK verwendet

Das obige ist der detaillierte Inhalt vonWas ist die standardmäßige dynamische Proxy-Methode von SpringBoot/Spring AOP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen