Aop動(dòng)態(tài)代理和cglib實(shí)現(xiàn)代碼詳解
一般我們使用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)文章
springboot集成redis實(shí)現(xiàn)簡單秒殺系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了springboot集成redis實(shí)現(xiàn)簡單秒殺系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
JavaSE經(jīng)典小練習(xí)項(xiàng)目之拷貝文件夾
文件拷貝是一個(gè)常見的任務(wù),無論是備份文件,還是將文件從一個(gè)位置復(fù)制到另一個(gè)位置,文件拷貝都是必不可少的,這篇文章主要給大家介紹了關(guān)于JavaSE經(jīng)典小練習(xí)項(xiàng)目之拷貝文件夾的相關(guān)資料,需要的朋友可以參考下2023-10-10
mybatis多對(duì)多查詢的實(shí)現(xiàn)(xml方式和注解方式)
本文主要介紹了mybatis多對(duì)多查詢的實(shí)現(xiàn),有xml方式和注解方式兩種,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
SpringCloudGateway網(wǎng)關(guān)處攔截并修改請(qǐng)求的操作方法
這篇文章主要介紹了SpringCloudGateway網(wǎng)關(guān)處攔截并修改請(qǐng)求的操作方法,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
Java使用正則表達(dá)式實(shí)現(xiàn)找出數(shù)字功能示例
這篇文章主要介紹了Java使用正則表達(dá)式實(shí)現(xiàn)找出數(shù)字功能,結(jié)合實(shí)例形式分析了Java針對(duì)數(shù)字的匹配查找及非數(shù)字替換操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03
Java如何調(diào)用wsdl的webservice接口
這篇文章主要介紹了Java如何調(diào)用wsdl的webservice接口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05

