在 SpringBoot 2.x AOP中會預設使用Cglib來實現,但是Spring5中預設還是使用jdk動態代理程式。 Spring AOP 預設使用 JDK 動態代理,如果物件沒有實作接口,則使用 CGLIB 代理。當然,也可以強制使用 CGLIB 代理程式。
在SpringBoot 中,透過AopAutoConfiguration來自動組裝AOP.
Springboot 1.x AOP預設還是使用JDK 動態代理的
因為JDK 動態代理程式是基於介面的,代理程式生成的物件只能賦值給介面變數。 JDK動態代理使用Proxy.newProxyInstance()來建立代理實作類,然而第二個參數就需要介面類型,如果沒有介面類型就會報錯。
Proxy.newProxyInstance(iCustomerInstance.getClass().getClassLoader(), iCustomerInstance.getClass().getInterfaces(), this);
而 CGLIB 就不存在這個問題。因為 CGLIB 是透過生成子類別來實現的,代理物件無論是賦值給介面還是實作類,這兩者都是代理物件的父類。
所以在2.x版本以上,將 AOP 預設實作改為 CGLIB代理。
新建一個介面
public interface ICustomService { void printf(); }
新建一個ICustomService的實作類別
@Service public class CustomServiceImpl implements ICustomService { public void printf() { } }
再增加一個類別不實作任何介面
@Service public class CustomNoImpl { public void hello() { } }
然後啟動,可以ICustomService和CustomNoImpl看出AOP的代理程式使用的是CGLIB的動態代理
#然後我們透過application.properties配置將代理預設為JDK代理。
spring.aop.proxy-target-class=false
然後啟動調試發現,CustomNoImpl因為沒有實現接口,所以使用的是CGLIB生成的代理,而
customService有接口實現,所以使用JDK的動態代理
以上是SpringBoot/Spring AOP預設動態代理方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!