![](/img/trans.png)
[英]How many proxies created in Java application use Spring core, Hibernate, 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.