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.
Springboot 1.x AOP verwendet standardmäßig immer noch den dynamischen JDK-Proxy
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
customService über eine Schnittstellenimplementierung verfügt und daher den dynamischen Proxy von JDK verwendetDas 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!