1. 程式人生 > >Sping-AOP:cglib動態代理與JDK動態代理的區別

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-AOPcglib動態代理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.encodingfile.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 和 目標