电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java 動態(tài)代理的多種實現(xiàn)方式

瀏覽:94日期:2022-08-11 09:47:38
目錄一、動態(tài)代理簡介二、動態(tài)代理的多種實現(xiàn)1. 基于JDK的實現(xiàn)2. 基于cglib的實現(xiàn)三、為什么要有基于cglib的實現(xiàn)四、兩種方式的適用場景JDK動態(tài)代理優(yōu)點缺點適用場景cglib優(yōu)點缺點適用場景一、動態(tài)代理簡介

優(yōu)勢:在不修改源碼的情況下,對目標方法進行相應(yīng)的增強。

作用:完成程序功能之間的松耦合。

二、動態(tài)代理的多種實現(xiàn) JDK代理:基于接口的動態(tài)代理技術(shù)(缺點,目標對象必須有接口,如果沒有接口,則無法完成動態(tài)代理的實現(xiàn)) cglib代理:基于父類的動態(tài)代理技術(shù)

兩者的區(qū)別如圖所示:

Java 動態(tài)代理的多種實現(xiàn)方式

1. 基于JDK的實現(xiàn)

目標接口類:

public interface TargetInterface {public void save();public void print(String str);}

目標類:

public class Target implements TargetInterface{public void save() {System.out.println('save running...');}public void print(String str) {System.out.println(str);}}

增強類:

public class Advice {public void before() {System.out.println('前置增強');}public void after() {System.out.println('后置增強');}}

測試類:

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyTest {public static void main(String[] args) {//目標對象final Target target = new Target();//增強對象final Advice advice = new Advice();TargetInterface proxyInstance = (TargetInterface)Proxy.newProxyInstance(target.getClass().getClassLoader(), //目標對象類加載器target.getClass().getInterfaces(), //目標對象相同的接口字節(jié)碼對象數(shù)組new InvocationHandler() {//調(diào)用代理對象的任何方法,實質(zhì)執(zhí)行的都是invoke方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{advice.before();//前置增強Object invoke = method.invoke(target, args);//執(zhí)行目標方法advice.after();//后置增強System.out.println();return invoke;}});//代理對象的方法測試proxyInstance.save();proxyInstance.print('JDK動態(tài)代理');}}

運行截圖:

Java 動態(tài)代理的多種實現(xiàn)方式

2. 基于cglib的實現(xiàn)

需要導入Jar包,如果是maven項目,則在pom.xml文件加入如下配置:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.4.RELEASE</version></dependency>

目標類:

public class Target {public void save() {System.out.println('save running...');}public void print(String str) {System.out.println(str);}}

增強類:

public class Advice {public void before() {System.out.println('前置增強');}public void after() {System.out.println('后置增強');}}

測試類:

import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;public class ProxyTest {public static void main(String[] args) {final Target target = new Target();final Advice advice = new Advice();//返回值就是動態(tài)生成的代理對象,基于cglib//創(chuàng)建增強器Enhancer enhancer = new Enhancer();//設(shè)置父類(目標)enhancer.setSuperclass(Target.class);//設(shè)置回調(diào)enhancer.setCallback(new MethodInterceptor() {public Object intercept(Object o, Method method, Object[] obj, MethodProxy methodProxy) throws Throwable{advice.before();Object invoke = method.invoke(target, obj);advice.after();System.out.println();return invoke;}});//創(chuàng)建代理對象Target proxy = (Target)enhancer.create();//測試代理方法proxy.save();proxy.print('基于cglib實現(xiàn)動態(tài)規(guī)劃');}}

運行截圖:

Java 動態(tài)代理的多種實現(xiàn)方式

三、為什么要有基于cglib的實現(xiàn)

使用JDK動態(tài)代理實現(xiàn)時,最大限制是被增強對象必須實現(xiàn)接口,并且增強的方法只能是接口中聲明的方法。但在實際的項目中,可能總是存在對不實現(xiàn)業(yè)務(wù)接口的對象進行增強的需求,這時JDK動態(tài)代理將無能為力。

四、兩種方式的適用場景JDK動態(tài)代理優(yōu)點 不依賴第三方j(luò)ar包, 使用方便 隨著JDK的升級,JDK動態(tài)代理的性能在穩(wěn)步提升缺點 只能代理實現(xiàn)了接口的類 執(zhí)行速度較慢 適用場景 如果你的程序需要頻繁、反復地創(chuàng)建代理對象,則JDK動態(tài)代理在性能上更占優(yōu)。cglib優(yōu)點

由于是動態(tài)生成字節(jié)碼實現(xiàn)代理,因此代理對象的執(zhí)行速度較快, 約為JDK動態(tài)代理的1.5 ~ 2倍可以代理沒有實現(xiàn)接口的對象

缺點 不能代理final類 動態(tài)生成字節(jié)碼雖然執(zhí)行較快,但是生成速度很慢,根據(jù)網(wǎng)上一些人的測試結(jié)果,cglib創(chuàng)建代理對象的速度要比JDK慢10 ~ 15倍。適用場景 不需要頻繁創(chuàng)建代理對象的應(yīng)用,如Spring中默認的單例bean,只需要在容器啟動時生成一次代理對象。

以上就是Java 動態(tài)代理的多種實現(xiàn)方式的詳細內(nèi)容,更多關(guān)于Java 動態(tài)代理的實現(xiàn)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 阜阳在线-阜阳综合门户| 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 西安中国国际旅行社(西安国旅) | 派财经_聚焦数字经济内容服务平台 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 | 废气处理_废气处理设备_工业废气处理_江苏龙泰环保设备制造有限公司 | 24位ADC|8位MCU-芯易德科技有限公司| 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂]| PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 土壤养分检测仪|土壤水分|土壤紧实度测定仪|土壤墒情监测系统-土壤仪器网 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 安徽华耐泵阀有限公司-官方网站| 空压机网_《压缩机》杂志 | GAST/BRIWATEC/CINCINNATI/KARL-KLEIN/ZIEHL-ABEGG风机|亚喜科技 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 即用型透析袋,透析袋夹子,药敏纸片,L型涂布棒-上海桥星贸易有限公司 | 校园文化空间设计-数字化|中医文化空间设计-党建|法治廉政主题文化空间施工-山东锐尚文化传播公司 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 小型气象站_车载气象站_便携气象站-山东风途物联网 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 福尔卡(北京)新型材料技术股份有限公司| 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 开平机_纵剪机厂家_开平机生产厂家|诚信互赢-泰安瑞烨精工机械制造有限公司 |