mybatis静态代理jdk动态代理
背景有时目标对象不可直接访问,只能通过代理对象访问图示:
示例1:房东目标对象房屋中介代理对象你,我客户端对象示例2:运营商(电信,移动,联通)目标对象第三方公司代理对象开发的应用程序需要发送短信的功能(或者需要支付功能)客户端对象代理模式的作用控制客户对目标对象的访问增强访问功能代理模式的分类静态代理动态代理JDK动态代理CGLib动态代理静态代理特点目标对象和代理对象实现同一个业务接口目标对象必须实现接口代理对象在程序运行前就已经存在静态代理示例与原理分析业务背景
分析定义业务接口:面向接口编程,定义业务目标对象实现接口:业务的核心功能到底怎么实现代理对象(扩展业务核心业务)实现了目标对象所实现的接口,说明代理对象有资历进行代理对核心业务进行扩展调用目标对象实现核心业务(只能目标对象自己完成)客户:无法直接访问目标对象,要访问代理对象代码实现面向接口编程成员变量是接口类型传入目标对象,方法的参数设计为接口调用时,接口指向实现类静态代理对象代码packagecom。example。service。impl;importcom。example。service。Service;publicclassAgentimplementsService{定义接口对象publicServicetarget;publicAgent(){}传入接口对象publicAgent(Servicetarget){this。targettarget;}Overridepublicvoidsing(){System。out。println(协商演出时间。。。。。。);System。out。println(协商演出地点。。。。。。);目标对象完成核心业务,接口指向实现类,调用实现类的方法target。sing();System。out。println(协商演出费用。。。。。。);}}静态代理优缺点优点:能够灵活地进行目标对象的切换适用于业务固定,目标对象可灵活切换的场景缺点:无法进行功能的灵活处理,当业务发生改变时,所有涉及到的实现类代码和代理对象代码都要改变动态代理JDK动态代理特点目标对象必须实现业务接口JDK代理对象不需要实现业务接口JDK代理对象在程序运行前不存在,程序运行时动态的在内存中构建(根据受代理的对象动态创建)JDK动态代理可以灵活的进行业务功能的切换JDK动态代理用到的类和接口使用现有的工具类完成JDK动态代理先了解两个单词的意思InvocationHandler:调用处理程序invoke:调用Method类反射时用的类,用来进行目标对象的目标方法的反射调用method对象,接住我们正在调用的方法sing(),show()methodsing(),show(),即:待调用的方法method。invoke()相当于手工调用目标方法sing(),show();InvocationHandler接口用来实现代理和业务功能,我们在调用时使用匿名内部实现匿名内部实现:new接口的同时,重写接口中的方法(相当于定义了该接口的一个实现类)Proxy类位于:java。lang。reflect。Proxy包下有一个核心方法:Proxy。newProxyInstance(。。。。),专门获取动态代理对象,有三个参数参数1:ClassLoaderloader目标对象的类加载器目的:获取类方法等信息,毕竟底层还是要调用受代理对象所实现的方法传入:targetObj。getClass()。getClassLoader();参数2:Classlt;?〔〕interfaces目标对象实现的所有接口,类的接口可以有多个目的:获取目标对象实现的所有接口以及接口的相关信息,毕竟底层要知道目标对象都可以完成哪些业务操作传入:targetObj。getClass()。getInterfaces();上面两个参数为代理对象动态的创建和调用目标对象的方法提供了数据支持,第3个参数相当于调用程序参数3:InvocationHandler实现代理功能的接口,这里代理功能包括:扩展的功能核心业务功能,传入的匿名内部实现如下newInvocationHandler(){OverridepublicObjectinvoke(Objectobj,用来反射调用方法Methodmethod,待调用方法需要的参数Object〔〕args)throwsThrowable{扩展业务System。out。println(协商演出时间。。。。。。);System。out。println(协商演出地点。。。。。。);核心业务,具体调用什么方法根据外层业务来反射调用对应方法Objectresmethod。invoke(target,args);扩展业务System。out。println(协商演出费用。。。。。。);目标对象执行的目标方法的返回值returnres;}}JDK动态代理示例代理工厂代码packagecom。example。proxy;importcom。example。service。Service;importjava。lang。reflect。InvocationHandler;importjava。lang。reflect。Method;importjava。lang。reflect。Proxy;publicclassProxyFactory{目标对象Servicetarget;publicProxyFactory(){}publicProxyFactory(Servicetarget){this。targettarget;}返回代理对象publicObjectgetAgent(){returnProxy。newProxyInstance(需要知道受代理对象的类信息target。getClass()。getClassLoader(),需要知道受代理对象实现的所有接口信息target。getClass()。getInterfaces(),反射调用目标对象的目标方法newInvocationHandler(){OverridepublicObjectinvoke(Objectobj,用来反射调用方法Methodmethod,待调用方法需要的参数Object〔〕args)throwsThrowable{扩展业务System。out。println(协商演出时间。。。。。。);System。out。println(协商演出地点。。。。。。);核心业务,具体调用什么方法根据外层业务来反射调用对应方法Objectresmethod。invoke(target,args);扩展业务System。out。println(协商演出费用。。。。。。);目标对象执行的目标方法的返回值returnres;}});}}测试代码示例packagecom。example。proxy;importcom。example。service。Service;importcom。example。service。impl。SuperStarZhou;importorg。junit。Test;publicclassTestProxyFactory{TestpublicvoidtestGetProxy(){确定客户需求ProxyFactoryfactorynewProxyFactory(newSuperStarZhou());根据需求动态返回对应类型的代理对象Serviceagent(Service)factory。getAgent();依托对应类型的动态代理对象完成业务:扩展业务(动态代理对象完成)核心业务(目标对象完成)agent。sing();}TestpublicvoidtestGetProxy2(){ProxyFactoryfactorynewProxyFactory(newSuperStarZhou());Serviceagent(Service)factory。getAgent();Stringres(String)agent。show(60);System。out。println(res);}}注意可被代理的方法应该是受代理对象实现的所有接口中的方法与其所有实体方法的交集本类中独有的方法不被代理类型的转变TestpublicvoidtestGetProxy2(){ProxyFactoryfactorynewProxyFactory(newSuperStarZhou());Serviceagent(Service)factory。getAgent();ServiceliunewSuperStarLiu();System。out。println(类型1:liu。getClass());System。out。println(类型2:agent。getClass());}输出结果:类型1:classcom。example。service。impl。SuperStarLiu类型2:classcom。sun。proxy。Proxy7
真的是互联网寒冬吗?被裁员获20万元补贴,转身跳槽又涨薪30事件说明近日,一位互联网大厂员工晒出自己被裁的经历,却引来一众网友羡慕。原来这位网友在虾皮工作了两年。月薪已经达到了5万。被裁后,公司按规定给了N2的补贴,总共20……
我赴黎维和官兵举行仪式迎接国际和平日来源:人民网国际频道原创稿人民网大马士革9月20日电(记者薛丹通讯员张哲、李竹林)在2022年国际和平日到来之际,中国第21批赴黎维和多功能工兵分队全体官兵在驻地举行仪式……
英特尔13代酷睿处理器即将发布,多家厂商预热新主板此前,AMD已经发布了旗下全新的锐龙7000系列CPU,也会在近日公布其产品在国内市场的售价。而AMD在CPU领域的主要竞争对手英特尔也被爆料,将在9月28日正式发布旗下……
看了司马南老师相信的短文,想起了我的一段经历,颇有感触那个年代,人与人之间都是信任,甚至陌生人之间都没有怀疑,人与人之间都是友善,都是为对方着想,可能现在的人不会理解那时人们的想法和做法。这让我想起了自己亲身经历的一件事,至……
拒绝浮躁,发挥长处9月2日,华为轮值董事长孟晚舟来到贵州都匀市,与母校都匀一中和都匀三小的师生共上开学一堂课,发表了读书万卷,咖啡千杯的主题演讲。演讲在网上刷屏了,很多人在演讲中获益匪浅。……
幸福就是那村,那孩,那红红的杨梅一句话概括,幸福是什么?每每忆及自己的教书生涯,那山村老师的几年,仿佛总是还在昨日,愈品愈幸福。那个夏天,一定一定还没远去吧?我,扛着一个二十余近重的行李箱,有点阴……
真正的好父母,都有点儿自私文芊和01朋友小丽在大家眼里是个有点儿自私的妈妈。和她一起带孩子出去吃饭,别的妈妈都忙着照顾孩子,夹菜、喂饭,把好吃的留给孩子,她却大口朵颐,认真享受自己的美味;……
官宣!双外援就位!北控男篮哈登组合强力来袭经CBA联盟审核通过,罗伯特高登正式成为北控男篮的一员,代表北控篮球俱乐部征战20222023赛季CBA联赛!同时,北控篮球俱乐部本赛季与中锋艾萨克哈斯续约,在出征动员会现场,……
细究父母爱情中老丁在马桶上的离世,不是玩笑,是黑色幽默文老鑫老丁,也算是出场次数仅次于江德福的二号人物了。也是一直与江德福一家有着千丝万缕的联系,但就是这样一个人,却匆匆地下线了。老丁下线的比较突然,从江德福和安杰的对……
智慧工地安全绳检测识别系统智慧工地安全绳检测识别系统利用现场已有的监控摄像头,通过机器视觉边缘计算实时分析监控画面数据不用人工控制;燧机科技智慧工地安全绳检测识别系统可以及时发现监控区域人员未佩戴安全绳……
早安吉祥,向阳光,灵灿烂,幸福美满深秋的晨曦,唯美柔和。深秋的晨露,晶莹剔透。给点灵阳光,让灵灿烂,幸福美满!秋日生活打卡季头号周刊守护银龄世界把昨夜的清梦余香,写在深秋的早安祝福上,新的一天,愿你……
不管生活有多不容易,都要守住那一份优雅生容易,死容易,生死之间的生活不容易。生活很难,你必须全力以赴,不管生活有多不容易,都要守住那一份优雅,永远保持对生活的热情,去发现生活的美丽。活得容易的人,似乎总是快乐……