通過(guò)案例理解Spring中靜態(tài)代理
參考http://www.fzitv.net/program/3545702mr.htm
無(wú)論是靜態(tài)代理還是動(dòng)態(tài)代理,都有四大角色:
- 抽象角色:一般會(huì)使用接口或者抽象類來(lái)解決
- 真實(shí)角色:被代理的角色
- 代理角色:代理真實(shí)角色,一般會(huì)做一些附屬操作
- 客戶:訪問(wèn)代理對(duì)象的人
中介租房案例
首先,定義一個(gè)接口(Rent),房東類(Host)實(shí)現(xiàn)該接口,并輸出自己房子的相關(guān)信息。
//租房
public interface Rent {
public void rent();
}
//房東
public class Host implements Rent{
public void rent() {
System.out.println("我的房子是藍(lán)色的,準(zhǔn)備出租房子!");
}
}
房東將房子交給中介,此時(shí)的中介相當(dāng)于代理類(Proxy)
代理類在不修改被代理對(duì)象功能 (Host類的rent方法) 的基礎(chǔ)上,可以對(duì)代理類進(jìn)行擴(kuò)展(增加seeHouse、fare方法)
public class Proxy implements Rent{
private Host host;
public Proxy(){ }
public Proxy(Host host){
this.host=host;
}
public void rent() {
seeHouse();
host.rent();
fare();
}
//看房
public void seeHouse(){
System.out.println("中介帶你看房子");
}
}
//收費(fèi)
public void fare(){
System.out.println("收中介費(fèi)");
}
}客戶購(gòu)房不用面對(duì)房東,只需與中介對(duì)接。
public class Client {
public static void main(String[] args) {
Host host=new Host(); //房東要出租房子
//代理,中介幫房東租房子,但是代理角色一般會(huì)有一些附屬操作
Proxy proxy=new Proxy(host);
//客戶不用面對(duì)房東,直接找中介租房即可
proxy.rent();
}
}
上述代碼就實(shí)現(xiàn)了靜態(tài)代理,客戶只需面向代理類操作即可。
運(yùn)行截圖

缺點(diǎn):靜態(tài)代理中,每個(gè)真實(shí)對(duì)象都會(huì)擁有一個(gè)代理類,這樣將會(huì)十分繁瑣。
如果采用靜態(tài)代理,當(dāng)有100個(gè)房東時(shí),我們將要編寫100個(gè)代理類,這種處理方法明顯不妥。因此我們可以使用動(dòng)態(tài)代理,編寫一個(gè)代理工具類,該類并未指明代理的真實(shí)對(duì)象是哪一個(gè)。
public class DynamicProxy {
public static Object getProxyInstance(Object target){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
(proxy, method, args)->{
Object result = method.invoke(target,args);
return result;
}
);
}
}public class Client {
public static void main(String[] args) {
Rent proxyInstance1 = (Rent) DynamicProxy.getProxyInstance(
new Host1());
proxyInstance1.rent();
Rent proxyInstance2 = (Rent)DynamicProxy.getProxyInstance(
new Host2());
proxyInstance2.rent();
}
}到此這篇關(guān)于通過(guò)案例理解Spring中靜態(tài)代理的文章就介紹到這了,更多相關(guān)Spring靜態(tài)代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Xml中使用foreach遍歷對(duì)象實(shí)現(xiàn)代碼
這篇文章主要介紹了Xml中使用foreach遍歷對(duì)象實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
基于Java編寫一個(gè)PDF與Word文件轉(zhuǎn)換工具
前段時(shí)間一直使用到word文檔轉(zhuǎn)pdf或者pdf轉(zhuǎn)word,尋思著用Java應(yīng)該是可以實(shí)現(xiàn)的,于是花了點(diǎn)時(shí)間寫了個(gè)文件轉(zhuǎn)換工具,感興趣的可以了解一下2023-01-01
解析Java的可變長(zhǎng)參數(shù)列表及其使用時(shí)的注意點(diǎn)
這篇文章主要介紹了解析Java的可變參數(shù)列表及其使用時(shí)的注意點(diǎn),注意可變參數(shù)必須位于最后一項(xiàng),需要的朋友可以參考下2016-03-03
SpringBoot實(shí)現(xiàn)不同用戶不同訪問(wèn)權(quán)限的示例代碼
這篇文章主要介紹了在SpringBoot中使用SpringSecurity實(shí)現(xiàn)基于角色的權(quán)限控制,涵蓋依賴添加、數(shù)據(jù)庫(kù)設(shè)計(jì)、實(shí)體類與Repository接口、UserDetailsService實(shí)現(xiàn)、安全配置、控制器創(chuàng)建及測(cè)試數(shù)據(jù)準(zhǔn)備,并提及@PreAuthorize注解與角色繼承配置,需要的朋友可以參考下2025-07-07
LeetCode程序員面試題之無(wú)重復(fù)字符的最長(zhǎng)子串
Java計(jì)算無(wú)重復(fù)字符的最長(zhǎng)子串是一種常見(jiàn)的字符串處理算法,它的目的是找出一個(gè)字符串中無(wú)重復(fù)字符的最長(zhǎng)子串。該算法可以很好地解決一些字符串處理問(wèn)題,比如尋找字符串中重復(fù)字符的位置,以及計(jì)算字符串中無(wú)重復(fù)字符的最長(zhǎng)子串的長(zhǎng)度。2023-02-02
springboot訪問(wèn)請(qǐng)求404的原因及解決辦法
在使用Spring Boot開發(fā)應(yīng)用程序時(shí),有時(shí)可能會(huì)遇到訪問(wèn)請(qǐng)求出現(xiàn)404錯(cuò)誤的情況,即請(qǐng)求的資源未找到,這篇文章主要給大家介紹了關(guān)于springboot訪問(wèn)請(qǐng)求404的原因及解決辦法,需要的朋友可以參考下2023-09-09
Springboot+MultipartFile實(shí)現(xiàn)單文件,多文件批量上傳過(guò)程
在Spring?Boot中,若需Swagger顯示文件上傳按鈕,需使用@Consumes注解指定Content-Type(如multipart/form-data),以告知接口接受文件類型,此注解幫助Swagger正確識(shí)別請(qǐng)求參數(shù),確保功能展示完整2025-07-07

