Sping-AOP:cglib動態代理與JDK動態代理的區別
預設狀態下,Spring-AOP預設使用JDK動態代理,當需要代理的物件沒有實現任何介面時,才使用cglib動態代理。
下面,將向大家介紹JDK動態代理和Cglib動態代理的使用、兩者的區別已經注意事項。
一、JDK動態代理
由於JDK動態代理是基於介面,所以我們先定義一個介面和該介面的實現。
//介面
package com.ghs.aop.proxy;
public interface TestService {
void testMethod1();
void testMethod2();
}
//介面的實現類
package com.ghs.aop.proxy.impl;
import com.ghs.aop.proxy.TestService;
public class TestServiceWithInterface implements TestService{
@Override
public void testMethod1() {
System.out.println("With Interface: I'm the first method!");
}
@Override
public void testMethod2() {
System.out.println("With Interface: I'm the second method!" );
}
}
下面,我們定義一個切面。
package com.ghs.aop.proxy;
public class ProxyAspect {
public void before(){
System.out.println("前置通知!");
}
public void after(){
System.out.println("後置通知!");
}
}
對該切面進行AOP配置,如下:
<bean id="testServiceWithInterface" class="com.ghs.aop.proxy.impl.TestServiceWithInterface" ></bean>
<bean id="proxyAspect" class="com.ghs.aop.proxy.ProxyAspect"></bean>
<aop:config>
<aop:aspect ref="proxyAspect">
<aop:pointcut expression="execution(* *.testMethod*(..))" id="proxyPointCut"/>
<aop:before method="before" pointcut-ref="proxyPointCut"/>
<aop:after method="after" pointcut-ref="proxyPointCut"/>
</aop:aspect>
</aop:config>
執行我們的測試程式碼
public class TestProxy {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-proxy.xml");
TestService withInterface = (TestService) context.getBean("testServiceWithInterface");
withInterface.testMethod1();
withInterface.testMethod2();
}
}
//執行結果如下:
前置通知!
With Interface: I'm the first method!
後置通知!
前置通知!
With Interface: I'm the second method!
後置通知!
我們需要注意下面幾點:
- 下面這句程式碼,只能將testServiceWithInterface物件強轉為TestService,而不能強轉為TestServiceWithInterface,因為JDK動態代理是基於介面的。
TestService withInterface = (TestService) context.getBean("testServiceWithInterface");
二、Cglib動態代理
在上面的例子中,如果需要強制使用cglib進行動態代理,其實只需要改一下aop的配置。
將
<aop:config>......</aop:config>
改為
<aop:config proxy-target-class="true">......</aop:config>
其實預設情況下proxy-target-class值為false,此時,Spring-AOP預設使用JDK動態代理,當需要代理的物件沒有實現任何介面時,才使用cglib動態代理。
當proxy-target-class設定為true時,Spring-AOP對需要代理的物件統一使用cglib動態代理。
在使用cglib動態代理時,需要注意下面幾點:
- 需要引入cglib的jar包,有兩種方式,一是引入cglib.jar和asm.jar,二是引入cglib-nodep.jar
- 物件的final方法無法被攔截
相關推薦
Sping-AOP:cglib動態代理與JDK動態代理的區別
預設狀態下,Spring-AOP預設使用JDK動態代理,當需要代理的物件沒有實現任何介面時,才使用cglib動態代理。 下面,將向大家介紹JDK動態代理和Cglib動態代理的使用、兩者的區別已經注意事項。 一、JDK動態代理 由於JDK動態代理是基於介
Spring AOP 前篇(一):Java代理之JDK靜態代理、JDK動態代理、CGLIB動態代理
Spring AOP 前篇:Java代理之JDK靜態代理、JDK動態代理、CGLIB動態代理 該文章參考多篇文章的基礎上進行了簡化並做少許修改,方便理解。原文章地址如下: Java之代理(jdk靜態代理,jdk動態代理,cglib動態代理,aop,aspectj
AOP的基礎知識總結(jdk動態代理/cglib動態代理)
AOP的基礎知識總結(jdk動態代理/cglib動態代理) 知識總結 aop切面程式設計 切面: 切面包含了通知和切點,通知和切點共同定義了切面是什麼,在何時,何處執行切面邏輯。 切點: 如果說通知定義了在何時執行通知,那麼切點就定義了在何處執行通知。所
Java之代理(jdk靜態代理,jdk動態代理,cglib動態代理,aop,aspectj)
一.概念 代理是什麼呢?舉個例子,一個公司是賣攝像頭的,但公司不直接跟使用者打交道,而是通過代理商跟使用者打交道。如果:公司介面中有一個賣產品的方法,那麼公司需要實現這個方法,而代理商也必須實現這個方法。如果公司賣
AOP的底層實現-CGLIB動態代理和JDK動態代理
AOP是目前Spring框架中的核心之一,在應用中具有非常重要的作用,也是Spring其他元件的基礎。它是一種面向切面程式設計的思想。關於AOP的基礎知識,相信多數童鞋都已經瞭如指掌,我們就略過這部分,來講解下AOP的核心功能的底層實現機制:如何用動態代理來
cglib 與 JDK動態代理的執行效能比較
都說 Cglib 建立的動態代理的執行效能比 JDK 動態代理能高出大概 10 倍,今日抱著懷疑精神驗證了一下,發現情況有所不同,遂貼出實驗結果,以供參考和討論。 程式碼很簡單,首先,定義一個 Test 介面,和一個實現 TestImpl 。Test 介面僅定義一個方法 test,對傳入的 int 引數加
cglib動態代理和jdk動態代理的區別與應用
1,引入 如果從一個Controller呼叫Service的非事務方法a,然後在a裡呼叫事務方法b,b事務生效嗎? public void update() { updateActual(); int a = 1 / 0;
代理模式詳解:靜態代理、JDK動態代理與Cglib動態代理
1. 代理模式簡介分類 - 概念 代理,是為了在不修改目標物件的基礎上,增強目標方法的業務邏輯。 客戶類需要執行的是目標物件的目標方法,但是真正執行的是代理物件的代理方法,客戶類對目標物件的訪問是通過代理物件來實現的。當然,代理類與目標類需要實現同一個介面。 -
JDK靜態代理、JDK動態代理以及CGLIB動態代理
這裡轉載兩篇好文章:“深入理解JDK動態代理機制” ,深入理解CGLIB動態代理機制 : https://www.jianshu.com/p/471c80a7e831 https://www.jianshu.com/p/9a61af393e41?from=timeline&isapp
java代理模式學習,靜態代理,JDK動態代理,CGLIB動態代理
java代理模式學習,靜態代理,JDK動態代理,CGLIB動態代理 一、理解代理 1、代理,Proxy 。意思是:本來該你做的事兒,別人代替你去做。 比如說:即將
Java中的靜態代理、JDK動態代理、cglib動態代理
一、靜態代理 代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的代理。 靜態代理由業務實現類、業務代理類兩部分組成。業務實現類負責實現主要的業務方法,業務代理類負責對呼叫的業務方法作攔截、過濾、預處理。在需要呼叫
Java動態代理(JDK介面代理和Cglib類代理)
代理模式 代理模式是常用的java設計模式,它的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類與委託類之間通常會存在關聯關係,一個代理類的物件與一個委託類的物件關聯,代理類的物件本身並不真正實現服
從靜態代理,jdk動態代理到cglib動態代理-一文搞懂代理模式
代理模式是一種理論上非常簡單,但是各種地方的實現往往卻非常複雜。本文將從代理模式的基本概念出發,探討代理模式在java領域的應用與實現。讀完本文你將get到以下幾點: 為什麼需要代理模式,它通常用來解決什麼問題,以及代理模式的設計與實現思路 Java領域中代理模式3種不同實現型別(靜態代理,jdk動態代理,
代理模式之靜態代理,JDK動態代理和cglib動態代理
代理模式,顧名思義,就是通過代理去完成某些功能。比如,你需要購買火車票,不想跑那麼遠到火車站售票視窗買,可以去附近的火車票代售點買,或者到攜程等第三方網站買。這個時候,我們就把火車站叫做目標物件或者委託物件,也可以叫被代理物件,而火車票代售點和攜程就叫做代理物件。 一、靜態代理 靜態代理是最簡單的代理模式。需
動態代理與子類代理
llb ram 9.png str width row and lib cal 1.動態代理 java.lang.reflect.Proxy 對象 幫我們生成一個代理對象來完成這個記錄日誌的工作 動態代理:被代理的對象一定要實現接口 loader: 類加載器,跟被代理
JDK動態代理[2]----JDK動態代理的底層實現之Proxy源碼分析
sco 不可 -- 例如 mis tfs err eno entity 在上一篇裏為大家簡單介紹了什麽是代理模式?為什麽要使用代理模式?並用例子演示了一下靜態代理和動態代理的實現,分析了靜態代理和動態代理各自的優缺點。在這一篇中筆者打算深入源碼為大家剖析JDK動態代理實現的
動態代理之 JDK 動態代理
動態代理 動態代理源於設計模式中的代理模式,代理模式的主要作用就是使代理物件完成使用者的請求,遮蔽使用者對真實物件的訪問。通過代理物件去訪問目標物件來控制原物件的訪問。 代理模式的最典型的應用就是 Spring AOP。 靜態代理 代理模式的實現有兩種,靜態代理和動態代理,靜態代理的代理類是需要程式設計師去寫
JAVA總結(三):sun.jnu.encoding與file.encoding的區別
JAVA總結(三):sun.jnu.encoding與file.encoding的區別 2017年08月10日 19:39:24 蟻方陣 閱讀數:1704 標籤: java編碼位元組碼二進位制class檔案 更多 個人分類: jav
動態語言與靜態語言的區別
一 、靜態語言的優勢到底在哪? 來自robbin 摘自 http://www.javaeye.com/article/33971?page=7 引用 是像Java或者C#這樣強型別的準靜態語言在實現複雜的業務邏輯、開發大型商業系統、以及那些生命週期很長的應用中也有著非常強的優勢
web---JSP中動態include與靜態include的區別?
1. 動態include <jsp:include page="目標jsp"> 它的原理是使用了 request.getRequestDispatcher(目標jsp).include(request,response) 來實現頁面包含,其本質是將 源jsp 和 目標