首頁 > Java > java教程 > SpringBoot/Spring AOP預設動態代理方式是什麼

SpringBoot/Spring AOP預設動態代理方式是什麼

王林
發布: 2023-05-10 15:52:18
轉載
3200 人瀏覽過

1. springboot 2.x 以上版本 

在 SpringBoot 2.x AOP中會預設使用Cglib來實現,但是Spring5中預設還是使用jdk動態代理程式。 Spring AOP 預設使用 JDK 動態代理,如果物件沒有實作接口,則使用 CGLIB 代理。當然,也可以強制使用 CGLIB 代理程式。

在SpringBoot 中,透過AopAutoConfiguration來自動組裝AOP.

SpringBoot/Spring AOP預設動態代理方式是什麼

2. Springboot 1.x

Springboot 1.x AOP預設還是使用JDK 動態代理的

SpringBoot/Spring AOP預設動態代理方式是什麼

3.SpringBoot 2.x 為何預設使用Cglib

因為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的動態代理

SpringBoot/Spring AOP預設動態代理方式是什麼

#然後我們透過application.properties配置將代理預設為JDK代理。

spring.aop.proxy-target-class=false
登入後複製

然後啟動調試發現,CustomNoImpl因為沒有實現接口,所以使用的是CGLIB生成的代理,而

customService有接口實現,所以使用JDK的動態代理

SpringBoot/Spring AOP預設動態代理方式是什麼

以上是SpringBoot/Spring AOP預設動態代理方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板