欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Aop動(dòng)態(tài)代理和cglib實(shí)現(xiàn)代碼詳解

 更新時(shí)間:2020年12月07日 09:52:11   作者:夢澤千秋  
這篇文章主要介紹了Aop動(dòng)態(tài)代理和cglib實(shí)現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一般我們使用Aop對(duì)象時(shí),常用動(dòng)態(tài)代理模式,即是采用映射一個(gè)相同的類在此基礎(chǔ)上進(jìn)行前置后置操作。

動(dòng)態(tài)代理多是采用原類實(shí)現(xiàn)父類接口,然后動(dòng)態(tài)代理一個(gè)和原類相同的雙胞胎兄弟類來實(shí)現(xiàn)映射。

父類

public interface InterF {
  public void save();
}

需要映射的類

public class Origin implements InterF{
  @Override
  public void save() {
    System.out.println("測試一下");
  }
}

動(dòng)態(tài)代理映射,此類需要傳入相應(yīng)的原類對(duì)象

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author bai
 * @create 2019-10-25-16:47
 */
public class ProxyJdk implements InvocationHandler {

  private Object target;

  public Object getProxy(Object target){
    this.target=target;
    return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);

  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    System.out.println("我來了");
    Object invoke = method.invoke(target, args);
    System.out.println("我走了");
    return invoke;
  }
}

測試類

public class Mytest {
  public static void main(String[] args) {
    Origin o=new Origin();
    ProxyJdk pj=new ProxyJdk();
    InterF proxy = (InterF) pj.getProxy(o);

    proxy.save();
  }
}

復(fù)制代碼

cglib模式的代理和動(dòng)態(tài)代理大同小異,模式上相同,但cglib采用的是直接實(shí)現(xiàn)父子類,繼承原類來實(shí)現(xiàn)映射。

原類

public class Origin{
  public void save() {
    System.out.println("測試一下");
  }
}

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 bai
 * @create 2019-10-25-17:26
 */
public class CglibProxy implements MethodInterceptor{
  private Object target;//被代理目標(biāo)

  public Object getProxy(Object target){
    this.target=target;
    Enhancer enhancer = new Enhancer();
//1.設(shè)置基類
    enhancer.setSuperclass(target.getClass());
//2.設(shè)置回調(diào)接口
    enhancer.setCallback(this);//MethodInterceptor實(shí)現(xiàn)類
//3.創(chuàng)建動(dòng)態(tài)代理
    return enhancer.create();
  }
  @Override
  public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    System.out.println("準(zhǔn)備前");
    Object invoke = method.invoke(target, objects);
    System.out.println("準(zhǔn)備后");
    return invoke;
  }
}

o是傳入的對(duì)象,method是相應(yīng)的切點(diǎn)所切方法,objects即參數(shù)。

測試類

public class Mytest2 {
  public static void main(String[] args) {
    Origin o=new Origin();
    CglibProxy cp=new CglibProxy();
    Origin proxy = (Origin) cp.getProxy(o);
    proxy.save();
  }
}

cglib相對(duì)于動(dòng)態(tài)代理少了一個(gè)父類,更加便捷。且cglib使用時(shí)需要導(dǎo)入相應(yīng)的jar包

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • OpenFeign調(diào)用服務(wù)請求頭丟失Token的解決

    OpenFeign調(diào)用服務(wù)請求頭丟失Token的解決

    這篇文章主要介紹了OpenFeign調(diào)用服務(wù)請求頭丟失Token的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot優(yōu)化啟動(dòng)速度的方法實(shí)現(xiàn)

    SpringBoot優(yōu)化啟動(dòng)速度的方法實(shí)現(xiàn)

    本篇文章主要介紹了SpringBoot優(yōu)化啟動(dòng)速度的方法實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java算法之桶排序Bucket?Sort詳解

    Java算法之桶排序Bucket?Sort詳解

    這篇文章主要介紹了Java算法之桶排序Bucket?Sort詳解,桶排序(Bucket?Sort)又稱箱排序,是一種比較常用的排序算法,其算法原理是將數(shù)組分到有限數(shù)量的桶里,再對(duì)每個(gè)桶分別排好序,最后一次將每個(gè)桶中排好序的數(shù)輸出,需要的朋友可以參考下
    2023-10-10
  • java枚舉如何使用spring的@value注入屬性

    java枚舉如何使用spring的@value注入屬性

    這篇文章主要介紹了java枚舉如何使用spring的@value注入屬性問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Spring的@ComponentScan注解用法介紹

    Spring的@ComponentScan注解用法介紹

    這篇文章主要介紹了Spring的@ComponentScan注解用法介紹,@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定義包掃描的規(guī)則,然后根據(jù)定義的規(guī)則找出哪些需類需要自動(dòng)裝配到spring的bean容器中,然后交由spring進(jìn)行統(tǒng)一管理,需要的朋友可以參考下
    2023-11-11
  • Java讀取數(shù)據(jù)庫表的示例代碼

    Java讀取數(shù)據(jù)庫表的示例代碼

    這篇文章主要介紹了Java讀取數(shù)據(jù)庫表,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • SpringMVC異步處理操作(Callable和DeferredResult)

    SpringMVC異步處理操作(Callable和DeferredResult)

    這篇文章主要介紹了SpringMVC異步處理操作(Callable和DeferredResult),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 詳解Spring中BeanUtils工具類的使用

    詳解Spring中BeanUtils工具類的使用

    這篇文章主要通過一些示例為大家詳細(xì)介紹了Spring中BeanUtils工具類的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • JavaWeb項(xiàng)目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案

    JavaWeb項(xiàng)目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案

    這篇文章主要介紹了JavaWeb項(xiàng)目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • maven私服搭建的實(shí)現(xiàn)步驟

    maven私服搭建的實(shí)現(xiàn)步驟

    本文主要介紹了maven私服搭建的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論