日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring的静态代理和动态代理

發(fā)布時(shí)間:2025/7/14 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring的静态代理和动态代理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

??? 代理模式主要有兩種:靜態(tài)代理和動(dòng)態(tài)代理

??? 1,靜態(tài)代理:

??? 比如要在輸出“HelloWorld”前打印一個(gè)字符串“Welcome”

??? A:先定義一個(gè)接口類

public interface HelloWorldIF {???
??? public void print();???
//? public void say();???
}?

B:定義一個(gè)該接口的實(shí)現(xiàn)類

public class HelloWorldImpl implements HelloWorldIF{???
??
??? public void print(){???
??????? System.out.println("HelloWorld");???
??? }???
//? public void say(){???
//????? System.out.println("Say Hello!");???
//? }???
}????

C:定義一個(gè)靜態(tài)代理類

public class StaticProxy implements HelloWorldIF{???
??
??? public HelloWorld helloWorld ;???
??? public StaticProxy(HelloWorld helloWorld){???
??????? this.helloWorld = helloWorld;???
??? }???
???????
??? public void print(){???
??????? System.out.println("Welcome");???
??????? //相當(dāng)于回調(diào)???
??????? helloWorld.print();???
??? }???
???????
//? public void say(){???
//????? //相當(dāng)于回調(diào)???
//????? helloWorld.say();???
//? }???
}

可以看出靜態(tài)代理類有一個(gè)很不爽的缺點(diǎn):當(dāng)如果接口加一個(gè)方法(把上面所有的代碼的注釋給去掉),所有的實(shí)現(xiàn)類和代理類里都需要做個(gè)實(shí)現(xiàn)。這就增加了代碼的復(fù)雜度。動(dòng)態(tài)代理就可以避免這個(gè)缺點(diǎn)。

2,動(dòng)態(tài)代理

動(dòng)態(tài)代理與普通代理相比較,最大的好處是接口中聲明的所有方法都被轉(zhuǎn)移到一個(gè)集中的方法中處理(invoke),這樣,在接口方法數(shù)量比較多的時(shí)候,我們可以進(jìn)行靈活處理,而不需要像靜態(tài)代理那樣每個(gè)方法進(jìn)行中轉(zhuǎn)。

動(dòng)態(tài)代理類只能代理接口,代理類都需要實(shí)現(xiàn)InvocationHandler類,實(shí)現(xiàn)invoke方法。該方法就是調(diào)用被代理接口的所有方法時(shí)需要調(diào)用的,而invoke方法返回的值是被代理接口的一個(gè)實(shí)現(xiàn)類。

代理類:

import java.lang.reflect.InvocationHandler;???????
import java.lang.reflect.Method;???????
import java.lang.reflect.Proxy;???????
//動(dòng)態(tài)代理類只能代理接口,代理類都需要實(shí)現(xiàn)InvocationHandler類,實(shí)現(xiàn)invoke方法。該invoke方法就是調(diào)用被代理接口的所有方法時(shí)需要調(diào)用的,該invoke方法返回的值是被代理接口的一個(gè)實(shí)現(xiàn)類???????
public class DynamicProxy implements InvocationHandler{???????
???????????
??? private Object object;????????
??? //綁定關(guān)系,也就是關(guān)聯(lián)到哪個(gè)接口(與具體的實(shí)現(xiàn)類綁定)的哪些方法將被調(diào)用時(shí),執(zhí)行invoke方法。???
??? //Proxy.newProxyInstance的第三個(gè)參數(shù)是表明這些被攔截的方法執(zhí)行時(shí)需要執(zhí)行哪個(gè)InvocationHandler的invoke方法???
??? public Object bindRelation(Object object){????????
??????? this.object = object;???????
??????? return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);????????
??? }????????
??? //攔截關(guān)聯(lián)的這個(gè)實(shí)現(xiàn)類的方法被調(diào)用時(shí)將被執(zhí)行???????
??? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {????????
??????? System.out.println("Welcome");???????
??????? Object result = method.invoke(object, args);????????
??????? return result;???????
??? }???????
??????
}

測(cè)試類:

public class TestDynamicProxy {???????
??? public static void main(String[] args){???????
??????? HelloWorld helloWorld = new HelloWorldImpl();???????
??????? DynamicProxy dp = new DynamicProxy();???????
??????? //在這里綁定的是HelloWorld,也就是HelloWorld是被代理接口。所以綁定關(guān)系時(shí),需要傳遞一個(gè)HelloWorld的實(shí)現(xiàn)類的實(shí)例化對(duì)象。???????
??????? HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);????????
??????? helloWorld1.print();????????
??????? helloWorld1.say();???????
???????????
??????? //helloWorld2將不被攔截???
??????? HelloWorld helloWorld2 = new HelloWorldImpl();???
??????? helloWorld2.print();????????
??????? helloWorld2.say();???
???????????
??? }???????
}??????? ??????

在測(cè)試類里調(diào)用實(shí)現(xiàn)類的print和say方法,因?yàn)榇眍惱锎砹薍elloWorld的所有方法。所以就不需要像靜態(tài)代理類那樣一一實(shí)現(xiàn)了。?

轉(zhuǎn)載于:https://my.oschina.net/simpleton/blog/839154

總結(jié)

以上是生活随笔為你收集整理的Spring的静态代理和动态代理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。