簡體   English   中英

在Spring AOP中使用代理

[英]Use of proxies in Spring AOP

我正在讀一本關於在Spring AOP中啟用AspectJ支持的書。

以下是從該書中摘錄的一段:

要在Spring IoC容器中啟用AspectJ注釋支持,您只需在bean配置文件中定義一個空的XML元素aop:aspectj-autoproxy。 然后,Spring將自動為您的AspectJ方面匹配的任何bean創建代理。

對於接口不可用或未在應用程序設計中使用的情況,可以依靠CGLIB創建代理。 要啟用CGLIB,您需要在<aop:aspectj-autoproxy />設置屬性proxy-target-class=true


我無法得到第二段。 ' 接口不可用 ' 什么意思。 任何人都可以用一個例子說明這一點

Spring AOP使用JDK動態代理或CGLIB來創建目標對象的代理。

根據Spring文檔,如果您的目標實現至少一個接口,將使用JDK動態代理。 但是,如果目標對象未實現任何接口,則將創建CGLIB代理。

這是強制創建CGLIB代理的方法(set proxy-target-class =“ true ”):

 <aop:config proxy-target-class="true">
    <!-- other beans defined here... -->
 </aop:config>

使用AspectJ及其autopoxy支持時,您也可以強制使用CGLIB代理。 這是使用<aop:aspectj-autoproxy>的地方,此處“proxy-target-class”必須設置為true

<aop:aspectj-autoproxy proxy-target-class="true"/>

有關更多詳細信息,請參閱面向方面編程與Spring文檔的代理機制部分。

Spring更喜歡使用AOP接口,因為它可以使用JDK 代理

比方說,我有一個接口MyService

public interface MyService {
    void doSomething();
}

並實現MyServiceImpl

@Service
public class MyServiceImpl implements MyService {
    public void doSomething() {
        // does something!
    }
}

如果Spring發現您已為MyService配置了方面,它將創建一個實現MyService的JDK代理,然后將所有調用代理到MyServiceImpl bean,並在適當的位置添加方面功能。

JDK代理通過實現與目標對象相同的接口並委托對它的調用來工作; 如果沒有可實現的接口,它們將無法工作。 如果您沒有上面的接口,Spring需要使用像CGLIB這樣的字節代碼庫來在運行時動態創建包含方面功能的類。

我在這里找到了一個博客,清楚地解釋了AOP,Caching和Transaction如何使用運行時代理類工作。

當不編碼接口時(引用博客的部分' 如果bean類沒有實現任何接口怎么辦? '): -

默認情況下,如果您的bean沒有實現接口,Spring會使用技術繼承:在啟動時,會創建一個新類。 它繼承自bean類並在子方法中添加行為。 為了生成這樣的代理,Spring使用了一個名為cglib的第三方庫。

Spring AOP廣泛使用代理作為以非侵入方式實現跨領域關注(又稱方面)的機制,該思想基本上是使用代理作為包裝來豐富原始行為,即添加事務功能。

為實現此目的,有兩個選項,取決於原始對象是否實現接口。

在第一種情況下(原來的對象實現的至少一個接口)反射API的動態代理功能用於創建實現與原始對象,因此,代理可以用來代替相同的接口的代理對象。

在第二種情況下(原來的對象沒有實現任何接口),因此必須使用更精細的特技,這是CGLIB出現時。 根據項目頁面“CGLIB用於擴展Java類並在運行時實現接口”。 因此,在這種情況下,技巧包括創建一個擴展原始對象的代理,因此可以使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM