Java中靜態(tài)代理的使用與原理詳解
概述
代理模式是為一個(gè)對(duì)象提供一個(gè)替身,以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。即通過(guò)代理對(duì)象訪問(wèn)目標(biāo)對(duì)象.這樣做的好處是:可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作,即擴(kuò)展目標(biāo)對(duì)象的功能。
被代理的對(duì)象可以是遠(yuǎn)程對(duì)象、創(chuàng)建開銷大的對(duì)象或需要安全控制的對(duì)象
代理模式有不同的形式, 主要有三種靜態(tài)代理、動(dòng)態(tài)代理(JDK 代理、接口代理)和Cglib 代理(可以在內(nèi)存 動(dòng)態(tài)的創(chuàng)建對(duì)象,而不需要實(shí)現(xiàn)接口, 他是屬于動(dòng)態(tài)代理的范疇) 。
靜態(tài)代理在使用時(shí),需要定義接口或者父類,被代理對(duì)象(即目標(biāo)對(duì)象)與代理對(duì)象一起實(shí)現(xiàn)相同的接口或者是繼承相同父類。
應(yīng)用案例
① 代碼實(shí)現(xiàn)
具體要求
- 定義一個(gè)接口:ITeacherDao
- 目標(biāo)對(duì)象TeacherDAO 實(shí)現(xiàn)接口ITeacherDAO
- 使用靜態(tài)代理方式,就需要在代理對(duì)象TeacherDAOProxy 中也實(shí)現(xiàn)ITeacherDAO
- 調(diào)用的時(shí)候通過(guò)調(diào)用代理對(duì)象的方法來(lái)調(diào)用目標(biāo)對(duì)象.
- 特別提醒:代理對(duì)象與目標(biāo)對(duì)象要實(shí)現(xiàn)相同的接口,然后通過(guò)調(diào)用相同的方法來(lái)調(diào)用目標(biāo)對(duì)象的方法
public interface ITeacherDao {
void teach(); // 授課的方法
}
public class TeacherDao implements ITeacherDao {
@Override
public void teach() {
System.out.println(" 老師授課中 。。。。。");
}
}
//代理對(duì)象,靜態(tài)代理
public class TeacherDaoProxy implements ITeacherDao{
private ITeacherDao target; // 目標(biāo)對(duì)象,通過(guò)接口來(lái)聚合
//構(gòu)造器
public TeacherDaoProxy(ITeacherDao target) {
this.target = target;
}
@Override
public void teach() {
System.out.println("開始代理 完成某些操作。。。。。 ");//方法
target.teach();
System.out.println("提交。。。。。");//方法
}
}
//測(cè)試客戶端
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//創(chuàng)建目標(biāo)對(duì)象(被代理對(duì)象)
TeacherDao teacherDao = new TeacherDao();
//創(chuàng)建代理對(duì)象, 同時(shí)將被代理對(duì)象傳遞給代理對(duì)象
TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
//通過(guò)代理對(duì)象,調(diào)用到被代理對(duì)象的方法
//即:執(zhí)行的是代理對(duì)象的方法,代理對(duì)象再去調(diào)用目標(biāo)對(duì)象的方法
teacherDaoProxy.teach();
}
}② UML類圖

③ 靜態(tài)代理的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):在不修改目標(biāo)對(duì)象的功能前提下, 能通過(guò)代理對(duì)象對(duì)目標(biāo)功能擴(kuò)展
缺點(diǎn):因?yàn)榇韺?duì)象需要與目標(biāo)對(duì)象實(shí)現(xiàn)一樣的接口,所以會(huì)有很多代理類
一旦接口增加方法,目標(biāo)對(duì)象與代理對(duì)象都要維護(hù)
到此這篇關(guān)于Java中靜態(tài)代理的使用與原理詳解的文章就介紹到這了,更多相關(guān)Java靜態(tài)代理原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解mybatis foreach collection示例
這篇文章主要介紹了詳解mybatis foreach collection的相關(guān)資料,需要的朋友可以參考下2017-10-10
SpringBoot整合spring-data-jpa的方法
這篇文章主要介紹了SpringBoot整合spring-data-jpa的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
springboot-mysql-HikariCP集成過(guò)程
HiKariCP opens new window是數(shù)據(jù)庫(kù)連接池的一個(gè)后起之秀,號(hào)稱性能最好,可以完美地 PK 掉其他連接池,這篇文章主要介紹了springboot-mysql-HikariCP集成過(guò)程,需要的朋友可以參考下2023-07-07
Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
使用Spring自定義注解實(shí)現(xiàn)任務(wù)路由的方法
本篇文章主要介紹了使用Spring自定義注解實(shí)現(xiàn)任務(wù)路由的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
springboot 日志實(shí)現(xiàn)過(guò)程
Spring Boot 使用 SLF4J 作為日志門面,Logback 或 Log4j2 作為日志實(shí)現(xiàn),日志門面提供統(tǒng)一接口,簡(jiǎn)化日志記錄,實(shí)現(xiàn)負(fù)責(zé)具體功能,Spring Boot 默認(rèn)使用 SLF4J 和 Logback,可以通過(guò)配置文件或注解進(jìn)行日志記錄和控制,感興趣的朋友一起看看吧2025-01-01
虛擬線程在Spring?Boot中的正確使用方式及最佳實(shí)踐
虛擬線程是Java19引入的一項(xiàng)新特性,它屬于Project Loom項(xiàng)目的一部分,與傳統(tǒng)的線程不同,虛擬線程并不是由操作系統(tǒng)直接管理,而是由Java虛擬機(jī)控制,這篇文章主要介紹了虛擬線程在Spring?Boot中的正確使用方式及最佳實(shí)踐的相關(guān)資料,需要的朋友可以參考下2026-03-03
java生成圖片驗(yàn)證碼返回base64圖片信息方式
這篇文章主要介紹了java生成圖片驗(yàn)證碼返回base64圖片信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

