最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib

 更新時(shí)間:2023年12月02日 09:10:18   作者:nuomizhende45  
這篇文章主要介紹了深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib,一般我們編寫程序的思想是縱向的,也就是一個(gè)方法代碼從該方法第一行開始往下一步一步走,直到走完最后一行代碼,也就是說很多業(yè)務(wù)都需要的比如用戶鑒權(quán),資源釋放等,需要的朋友可以參考下

理解AOP

一般我們編寫程序的思想是縱向的,也就是一個(gè)方法代碼從該方法第一行開始往下一步一步走,直到走完最后一行代碼。

也就是說很多業(yè)務(wù)都需要的比如用戶鑒權(quán),資源釋放等我們都要在每個(gè)方法里面重復(fù)再去調(diào)用,如下所示:

public void doMethodOne()
{
    System.out.println("doMethodOne由上往下第一步:用戶鑒權(quán)");
    System.out.println("doMethodOne由上往下第二步:業(yè)務(wù)邏輯,調(diào)用服務(wù)1");
    System.out.println("doMethodOne由上往下最后一步:釋放資源");
}
public void doMethodTwo()
{
    System.out.println("doMethodTwo由上往下第一步:用戶鑒權(quán)");
    System.out.println("doMethodTwo由上往下第二步:業(yè)務(wù)邏輯,調(diào)用服務(wù)1");
    System.out.println("doMethodTwo由上往下最后一步:釋放資源");
}
public static void main(String[] args)
{
    doMethodOne();
    doMethodTwo();
}

AOP(面向切面編程),它可以用來攔截方法前后,來達(dá)到增強(qiáng)方法的目的。

所以我理解的AOP的本質(zhì)是在一系列縱向的控制流程中,把那些相同的子流程提取成一個(gè)橫向的面,就像下面這張圖把相同的邏輯,用戶鑒權(quán)、資源釋放抽取出來,橫切到各個(gè)需要該場景的方法的開頭、中間以及結(jié)尾。

SpringAOP中的一些術(shù)語

  • 通知(Advice): 何時(shí)(Before,After,Around,After還有幾個(gè)變種) 做什么
  • 連接點(diǎn)(JoinPoint): 應(yīng)用對象提供可以切入的所有功能(一般是方法,有時(shí)也是參數(shù))
  • 切點(diǎn)(PointCut): 通過指定,比如指定名稱,正則表達(dá)式過濾, 指定某個(gè)/些連接點(diǎn), 切點(diǎn)描繪了 在何地 做
  • 切面(Aspect): 通知 + 切點(diǎn) 何時(shí)何地做什么
  • 引入(Introduction):向現(xiàn)有類添加新的屬性或方法
  • 織入(Weaving): 就是將切面應(yīng)用到目標(biāo)對象的過程

實(shí)現(xiàn)方式之JDK的動(dòng)態(tài)代理

JDK動(dòng)態(tài)代理目標(biāo)是按照接口實(shí)現(xiàn)類的形式。

你需要?jiǎng)?chuàng)建一個(gè)jdkproxy 類來繼承InvocatoinHandler 接口,將你想要增強(qiáng)的代碼添加到里面的invoke方法中。

目標(biāo)類如下

package com.lee.aop.jdkaop;
/**
 * @author lee
 */
public interface UserServiceInf {
     void updateUser();
}
package com.lee.aop.jdkaop;
/**
 * @author lee
 */
public class UserServiceImpl implements UserServiceInf {
    @Override
    public void updateUser()
    {
        System.out.println("修改用戶");
    }
}

代理類如下:

package com.lee.aop.jdkaop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * @author lee
 */
public class MyProxy implements InvocationHandler {
    private Object target ;
    public Object getTarget()
    {
        return target;
    }
    public void setTarget(Object target)
    {
        this.target = target;
    }
    public Object createProxy(Object target)
    {
        this.target = target ;
        return Proxy.newProxyInstance(this.target.getClass().
                        getClassLoader(),this.target.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Method methods = this.target.getClass().getMethod("updateUser",null);
        System.out.println("用戶鑒權(quán)");
        methods.invoke(this.target,null);
        return null;
    }
}

測試類:

package com.lee.aop.jdkaop;
public class Tester {
    public static void main(String[] args) {
        UserServiceImpl userImpl = new UserServiceImpl();
        UserServiceInf service = (UserServiceInf) new MyProxy().createProxy(userImpl);
        service.updateUser();
    }
}

實(shí)現(xiàn)方式之CGlib動(dòng)態(tài)代理 

目標(biāo)類

package com.lee.aop.cglib;
/**
 * @author lee
 */
public class UserService {
    public void updateUser(String uid)
    {
        System.out.println("獲取User" + uid);
    }
}

 代理類

package com.lee.aop.cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
 * @author lee
 */
public class UserProxy implements MethodInterceptor {
    //通過Enhacer創(chuàng)建一個(gè)代理對象
    Enhancer proxy = new Enhancer();
    public Object getProxy(Class clz)
    {
        proxy.setSuperclass(clz);
        proxy.setCallback(this);
        return proxy.create();
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("用戶鑒權(quán)");
        methodProxy.invokeSuper(o,objects);
        return null;
    }
}

測試類

package com.lee.aop.cglib;
/**
 * @author lee
 */
public class Tester {
    public static void main(String[] args) {
        UserProxy proxy = new UserProxy();
        UserService userService = (UserService) proxy.getProxy(UserService.class);
        userService.updateUser("lee");
    }
}

JDK動(dòng)態(tài)代理與CGlib代理的區(qū)別

  • JDK動(dòng)態(tài)代理只能對實(shí)現(xiàn)了接口的類生成代理,而不能針對類
  • CGLIB是針對類實(shí)現(xiàn)代理,主要是對指定的類生成一個(gè)子類,覆蓋其中的方法(繼承)
  • JDK的動(dòng)態(tài)代理是基于類實(shí)現(xiàn)了接口,cglib是基于類,沒有強(qiáng)制要求目標(biāo)類一定要是實(shí)現(xiàn)接口。
  • JDK的核心是實(shí)現(xiàn)InvocationHandler接口,使用invoke()方法進(jìn)行面向切面的處理,調(diào)用相應(yīng)的通知。
  • CGLIB的核心是實(shí)現(xiàn)MethodInterceptor接口,使用intercept()方法進(jìn)行面向切面的處理,調(diào)用相應(yīng)的通知。

所以在Spring中當(dāng)Bean實(shí)現(xiàn)接口時(shí),Spring就會(huì)用JDK的動(dòng)態(tài)代理,當(dāng)Bean沒有實(shí)現(xiàn)接口時(shí),Spring使用CGlib來實(shí)現(xiàn)。

到此這篇關(guān)于深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib的文章就介紹到這了,更多相關(guān)jdk動(dòng)態(tài)代理與CGlib內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java刪除Word文檔中水印的實(shí)現(xiàn)方法

    Java刪除Word文檔中水印的實(shí)現(xiàn)方法

    在 Word 文檔中,水印常用于標(biāo)示文檔的狀態(tài),但可能會(huì)影響文檔的清晰度和專業(yè)性,本文將介紹如何使用 Java 刪除 Word 文檔中的水印,有需要的可以了解下
    2025-11-11
  • 淺談在Spring中如何使用數(shù)據(jù)源(DBCP、C3P0、JNDI)

    淺談在Spring中如何使用數(shù)據(jù)源(DBCP、C3P0、JNDI)

    這篇文章主要介紹了淺談在Spring中如何使用數(shù)據(jù)源(DBCP、C3P0、JNDI),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟異常

    Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟異常

    這篇文章主要為大家介紹了Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟的異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步
    2022-02-02
  • Spring反射內(nèi)置工具類ReflectionUtils用法及說明

    Spring反射內(nèi)置工具類ReflectionUtils用法及說明

    這段文章主要介紹了Java反射機(jī)制及其在獲取sentinel熔斷規(guī)則map和操作類屬性方法中的應(yīng)用,通過JDK和Spring的ReflectionUtils展示了如何優(yōu)雅地處理反射操作,提升代碼的可閱讀性和維護(hù)性
    2026-06-06
  • 詳解Java中Dijkstra(迪杰斯特拉)算法的圖解與實(shí)現(xiàn)

    詳解Java中Dijkstra(迪杰斯特拉)算法的圖解與實(shí)現(xiàn)

    Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文將詳解該算法的圖解與實(shí)現(xiàn),需要的可以參考一下
    2022-05-05
  • 基于重定向RedirectAttributes的用法解析

    基于重定向RedirectAttributes的用法解析

    這篇文章主要介紹了基于重定向RedirectAttributes的用法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • idea同步y(tǒng)api插件的詳細(xì)步驟

    idea同步y(tǒng)api插件的詳細(xì)步驟

    yapi是一個(gè)很好的接口文檔維護(hù)工具,其swagger功能,可將接口信息同步到y(tǒng)api平臺(tái)上,這篇文章主要介紹了idea同步y(tǒng)api插件,需要的朋友可以參考下
    2024-04-04
  • springboot redis使用lettuce配置多數(shù)據(jù)源的實(shí)現(xiàn)

    springboot redis使用lettuce配置多數(shù)據(jù)源的實(shí)現(xiàn)

    這篇文章主要介紹了springboot redis使用lettuce配置多數(shù)據(jù)源的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java中的switch case語句使用詳解

    java中的switch case語句使用詳解

    這篇文章主要介紹了java中的switch case語句使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot如何使用TestEntityManager進(jìn)行JPA集成測試

    SpringBoot如何使用TestEntityManager進(jìn)行JPA集成測試

    TestEntityManager是Spring Framework提供的一個(gè)測試框架,它可以幫助我們進(jìn)行 JPA 集成測試,在本文中,我們將介紹如何使用 TestEntityManager 進(jìn)行 JPA 集成測試,感興趣的跟著小編一起來學(xué)習(xí)吧
    2023-06-06

最新評論

宁津县| 米脂县| 民勤县| 南昌市| 信宜市| 民和| 临夏市| 万载县| 时尚| 安乡县| 宁阳县| 曲周县| 聊城市| 上思县| 赤水市| 都江堰市| 平湖市| 醴陵市| 南宁市| 庆安县| 林甸县| 霍林郭勒市| 蒙自县| 丰都县| 即墨市| 景德镇市| 赣榆县| 嘉义市| 陇西县| 咸阳市| 汉寿县| 满城县| 铜梁县| 双辽市| 阿坝县| 翁牛特旗| 米脂县| 垦利县| 大足县| 新乐市| 资兴市|