Spring——动态代理

2023-11-08

动态代理(理解):基于反射机制。

掌握程度:

1.什么是动态代理?

​ 使用jdk的反射机制,创建对象的能力,创建的是代理类的对象。而不用你创建类文件。不用谢java文件。

​ 动态:在程序执行时,调用JDK提供的方法才能创建代理类的对象。

​ jdk动态代理,必须有接口,目标类必须实现接口,没有接口时,需要使用cylib动态代理。

2.知道动态代理能做什么?

​ 可以在不改变原来目标方法功能的前提下,可以在代理中增强自己的功能代码。

​ 程序开发中的意思。

​ 比如:你所在的项目中,有一个功能是其他人(公司的其他部门,其他小组的人)写好的,你可以使用。

​ GoNong.class , GoNong gn = new GoNong(), gn,print();

​ 你发现这个功能,现在还缺点,不能完全满足我项目的需要,我需要在gn.print()执行后,需要自己在增强代码。

​ 用代理实现gn.print()调用时,增加自己代理,而不用去改变原来GoNang文件。

1.代理

代购,中介,换ip,商家等等

比如有一家美国的大学,可以对全世界招生,留学中介(代理)

留学中介(代理):帮助这家美国的学校招生,中介是学校的代理,中介是代理学校完成招生功能。

​ 代理特点:

​ 1.中介和代理他们要做的事情是一致的:招生。

​ 2.中介是学校代理,学校是目标。

​ 3.家长–中介(学校介绍,办入学手续)–美国学校。

​ 4.中介是代理,不能白干活,需要收取费用

​ 5.代理不让你访问到目标。

​ 为什么要找中介?

​ 1.中介是种业的,方便

​ 2.家长现在不能自己去找学校,加载没有能力访问学校。或者灭国学校不接收个人来访。

​ 买东西都是商家卖,商家是某个商品的代理,你个人买东西,肯定不会让你接触到厂家的。

2.在开发中也会有这样的情况,你有a类,本来是调用c类的方法,完成某个功能。但是c不然a调用。

a-----不能调用c的方法

在a和c之间 创建一个b代理,c让b访问

a----访问b----访问c

​ 实际的例子:登录,注册有验证码,验证码是手机短信。

​ 中国移动,联通能发短信。

​ 中国移动,联通能有子公司,或者关联公司,他们面向社会提供短信的发送功能。

​ 张三项目发送短信----子公司,或者关联公司—中国移动,联通

2.代理模式

**代理模式:**代理模式是指,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之间起到中介的作用。-

​ ------百度百科《代理模式》

换句话说,使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。

客户类真正的想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象

客户类对目标对象的访问是通过访问代理对象来实现的,当然,代理类与目标类要实现同一个接口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ueVSIS1j-1653224592560)(C:\Users\lenovo\Documents\Tencent Files\1551302120\FileRecv\MobileFile\BBEABC1368A55B1EAFFB94310E2ECB4A.png)]

2.1使用代理模式的作用:

​ 1.功能增强 :在你原有的功能上,增强了额外的功能。新增加的功能,叫做功能增强。

​ 2.控制访问: 代理类不让你访问目标,例如商家不让用户访问厂家。

2.2实现代理的方式:

2.21.静态代理:

​ 1)代理类是自己手工实现的,自己创建一个java类,表示代理类。

​ 2)同时你所要代理的目标类是确定(固定)的。

​ 特点:1)实现简单 2)容易理解。

​ 缺点:当你的项目中,目标类和代理类很多时候,有以下的缺点:

​ 1)当目标类增加了,代理类可能也需要成倍的增加。代理类数量过多。

​ 2)当你的接口中功能增加了,或者修改了,会影响众多的实现类,厂家类,代理都需要修改,影响比较大

例子:模拟一个用户购买U盘的行为。

用户是客户端类。

	*商家:代理,代理某个品牌的U盘*

厂家:目标类

三者的关系:用户(客户端)—商家(代理)—厂家(目标)

​ 实现步骤:

​ 1.创建一个接口,定义卖U盘的方法,表示你的厂家和商家做的事情。

​ 2.创建厂家类,实现1步骤的接口

​ 3.创建商家,就是代理,也需要实现1步骤中的接口。

​ *4.创建客户端类,调用商家的方法买一个U盘。

请添加图片描述

package com.bjpowernode.service;

//表示功能的,厂家,商家都要完成的功能
public interface UsbSell {
    //定义方法 参数 amount:表示一次购买单数量,暂时不用
    //返回值表示一个u盘的价值
    float sell(int amount);

    //可以多个其他的方法
}

package com.bjpowernode.factory;


import com.bjpowernode.service.UsbSell;

//目标类:金士顿厂家,不接受用户单独购买。
public class UsbKingFactory implements UsbSell {
    @Override
    public float sell(int amount) {
        System.out.println("目标类中的方法调用,UsbKingFactory中的 sell");
        //一个128G的U盘是 85元
        //后期根据amount,可以实现不同的价格,例如10000个,单击是80,50000个75
        return 85.0f;
    }
}

package com.bjpowernode.shangjia;

import com.bjpowernode.factory.UsbKingFactory;
import com.bjpowernode.service.UsbSell;

//taobao是一个商家,代理金士顿U盘的销售
public class TaoBao implements UsbSell {

    //声明 商家代理的厂家具体是谁
    private UsbKingFactory factory = new UsbKingFactory();

    @Override
    //实现销售U盘功能
    public float sell(int amount) {

        //向厂家发送订单,告诉厂家,我买了U盘,厂家发货
        float price = factory.sell(amount);//厂家的价格
        //商家 需要加价,也就是代理要增加价格
        price = price + 25;//增强功能,地阿里类在完成目标类方法调用后,增强了功能。
        //在目标类的方法调用后,你做的其他功能,都是增强的意思
        System.out.println("淘宝商家,给你返一个优惠券,或者红包");

        //增加的价格
        return price;
    }
}

package com.bjpowernode;


import com.bjpowernode.shangjia.TaoBao;

public class ShopMain {
    public static void main(String[] args) {
        //创建代理的商家taobao对象
        TaoBao taoBao = new TaoBao();
        float price = taoBao.sell(1);
        System.out.println("通过淘宝的商家,够哦买U盘单价:"+price);
    }
}

请添加图片描述

2.2.2 动态代理

在静态dialing中目标类很多时候,可以使用动态代理,避免静态代理的缺点。

动态代理中目标类即使很多,1)代理类数量可以很少 2)当你修改了接口中的方法时,不会影响代理类。

动态代理:在程序执行过程中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类。

​ 换句话说,动态代理是一种创建java对象的能力,让你不用创建TaoBao类,就能创建代理类对象。

在java中,要想创建对象: 1)创建类文件,java文件编译为class 2)使用构造方法,创建类的对象

动态代理定义

动态代理是指代理类对象在程序运行时由JVM跟腱炎反射机制动态生成的。动态代理不需要定义代理类的.java源文件。

动态代理其实就是jdk运行期间,动态创建class字节码并加载到JVM.

动态代理的实现方式常用的有两种:使用JDK代理代理,与通过CGLIB动态代理。

请添加图片描述

动态代理的实现:1.jdk动态代理 2.cglib动态代理

1)jdk动态代理:使用java反射包中的类和对象实现动态代理的功能。

​ 反射包java.lang.reflect ,里面有三个类:Proxy,Method和InovcationHandler.

2)cglib动态代理:cglib是第三方的工具库,创建代理对象。

​ cglib的原理是继承,cglib通过继承目标类,创建它的子类,在子类中重写父类中同名的方法,实现功能的 修改。

​ 因为cglib是继承,重写方法,所以要求目标类不能是final的,方法也不能是final的。

​ cglib的要求目标类比较宽松,只要能继承就可以了。cglib在狠毒的框架中使用,比如mybatis,soring框架中都有使用。

jdk动态代理:

​ 1.反射,Method类,表示方法。类中的方法。通过Method可以执行某个方法。

​ 2.jdk动态代理的实现:

​ 反射包java.lang.reflect ,里面有三个类:Proxy,Method和InovcationHandler.

1)InovcationHandler.接口:就一个方法invoke()

invoke():表示代理对象要执行的功能代码。你的代理类要完成的功能就写在invoke()方法中。

​ 代理类完成的功能:1)调用目标方法,执行目标方法的功能。

​ 2)功能增强,在目标方法调用时,增强功能。

​ 方法原型:public Object invoke(Object proxy, Method method, Object[] args)

​ 参数:

​ Object proxy:jdk创建的代理对象,无需赋值。

​ Method method:目标类中的方法,jdk提供method对象的

​ Object[] args:目标类中方法的参数

​ 怎么用:1.创建类实现接口InovcationHandler

​ 2.重写invoke()方法,把原来静态代理中代理类要完成的功能,卸载这里。

2)Method类:表示方法的,确切的说就是目标类中的方法。

​ 作用:通过Method可以执行某个目标类的方法,Method.invoke();

​ method.invoke(目标对象,方法的参数)

​ Object ret =method.invoke(service2,“李四”);

​ 说明:method.invoke()就是用来执行目标方法的,等同于静态代理中的

​ //向厂家发送订单,告诉产假,我买了U盘,厂家发货

​ float price = factory.sell(amount);//厂家的价格

3)Proxy类:核心的对象,创建代理对象。之前创建对象都是new类的构造方法()

​ 现在我们是使用proxy类的方法,代替new的使用。

​ 方法:静态方法newProxyInstance()

​ 作用是:创建代理对象,等同于静态代理中的TaoBao taoBao = new TaoBao();

​ 参数:

​ 1.ClassLoader loader 类加载器,负责向内存中加载对象的。使用反射获取对象的ClassLoader类a,a.getClass().getClassLoader(),目标对象的类加载器

​ 2.Class<?>[] interfaces:接口,目标对象实现的解耦,也是反射获取的。

​ 3.InvocationHandler h:我们自己写的,代理类要完成的功能

​ 返回值:就是代理对象。

​ public static Object newProxyInstance(ClassLoader loader,

​ Class<?>[] interfaces,

​ InvocationHandler h)

3.实现动态代理的步骤:

​ 1)创建接口,定义目标类要完成的功能

​ 2)创建目标类实现接口

​ 3)创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能(调用目标方法,增强功能)

​ 4)使用Proxy类的静态方法,创建代理对象。并把返回值转为接口类型。

请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring——动态代理 的相关文章

随机推荐

  • KVM——迁移KVM虚拟机

    一 KVM虚拟机迁移的方式 KVM平台中的KVM虚拟机迁移分为以下两种 1 冷迁移 静态迁移 我们存放虚拟机磁盘的目录都是挂在的一个nfs文件系统的磁盘 进行冷迁移时 只要在目标主机上挂载这个nfs文件系统 就可以看到要迁移的那个虚拟机的磁
  • Nuxt2+echarts5报错Unexpected token export?

    当在Nuxt js中使用ECharts 5时出现 Unexpected token export 错误通常是由于Nuxt js默认使用的是CommonJS模块系统 而ECharts 5使用ES模块语法所致 为了解决这个问题 需要对ES模块语
  • esp32-S3专题一:初识esp32

    初识esp32 S3 初识esp32 使用esp32 s3这款芯片开发接近一年了 分享一下开发中的一些经验和项目中的亮点 希望后人能从中借鉴到一些经验 一 优势和缺点 使用的是esp32 s3这款芯片 硬件上搭配300k的RAM的代码运行内
  • BIO、NIO、AIO 有什么区别?

    BIO NIO AIO 有什么区别 BIO 线程发起IO请求 不管内核是否准备好IO操作 从发起请求起 线程一直阻塞 直到操作完成 NIO 线程发起IO请求 立即返回 内核在做好IO操作的准备之后 通过调用注册的回调函数通知线程做IO操作
  • www.wljx.net/forum.php,齐博CMS:主页被黑,不知漏洞在哪?

    用的是PHP168 5 0和PHPWind Forums v6 3 2的高深度整合版本 今天早上发现主页被换了 好在能进后台 能ftp 换回自己的主页 仔细检查 在 cache 文件夹多了一个yf php文件 里面代码如下 请帮忙看看 ad
  • 理解GAN对抗神经网络的损失函数和训练过程

    GAN最不好理解的就是Loss函数的定义和训练过程 这里用一段代码来辅助理解 就能明白到底是怎么回事 其实GAN的损失函数并没有特殊之处 就是常用的binary crossentropy 关键在于训练过程中存在两个神经网络和两个损失函数 n
  • C++的6个缺省函数

    一 在C 中默认产生6个类成员函数 即缺省函数 它们分别是 1 缺省构造函数 2 缺省拷贝构造函数 3 缺省析构函数 4 缺省赋值运算符 5 缺省取址运算符 6 缺省取地址运算符 二 const对于空类 编译器不会生成任何的成员函数 只会生
  • Git将本地项目推送到远程仓库

    第一步 我们需要在自己电脑中创建一个空白文件夹 这个功能就是创建一个本地的版本库 第二步 进入test文件夹 在根部执行Git Bash Here 第三步 通过命令git init把这个文件夹变成Git可管理的仓库 这时你会发现TEST里面
  • react 16新特性介绍

    目录 React v16 0 2017 年 9 月 render 支持返回数组和字符串 错误边界 componentDidCatch Fiber React v16 2 2017 年 11 月 Fragment React v16 3 20
  • VMware NSX 4.0安装、配置和升级实战

    本文通过一个Vmware NSX 4的安装配置实例 扼要说明了一个典型的NSX系统配置 升级过程需要注意的正确步骤 并列出了作者在学习过程中踩过的坑 为同行绕过提供借鉴 1 系统软硬件环境说明 本安装实例 使用了3台Dell PowerEd
  • 【k8s基础篇】k8s scheme1 之内外部版本

    参考 K8s源码分析 3 Resource Version 内外部版本 1 简介 众所周知 在 kubernetes 中所有的 resource 都是基于 group 分组的 例如 apps group 中定义了我们熟悉并常用的 deplo
  • 综合实验(续)

    AdvancedInheritance 描述 不同的动物既有共性也有个性 鸟类会飞 鱼会游泳 请设计类的层次结构进行表示 并通过以下测试 int main Animal animal string type color bool Ostei
  • PuTTY 中文教程 作者:柴锋 2006年11月

    http chaifeng com blog 2007 06 putty 200611 html
  • Regionserver频繁挂掉故障处理实践

    近期腾讯云的一家大客户频繁出现HBase regionserver 挂掉 影响业务正常使用 通过调整堆栈大小 gc优化 超时时间等都无法解决该问题 经过细致并综合分析hbase regionserver hbase master以及 zoo
  • vue项目打包和部署?

    vue项目打包和部署 1 执行打包命令 npm run build 打包过程 看到上图则代表已打包完成 此时项目中会生成dist目录 dist目录中有static目录和index html 2 打包完成后 此时直接用浏览器打开index h
  • 每日一题:Alice的德州扑克

    Alice的德州扑克 题目 Daimayuan Online Judge 从最大的牌开始判断 如果满足直接输出 return 0 否则就接着判断 一层一层往下判断 AC代码 include
  • win10添加环境变量后没用_今天告诉你Win10系统配置环境变量未生效的完全解决教程...

    有网友用win10系统的时候遇到过Win10系统配置环境变量未生效的问题 不知道大家是不是也遇到过 想必我们大家以后也可能会遇到Win10系统配置环境变量未生效的情况 那能不能解决呢 肯定时可以解决Win10系统配置环境变量未生效的问题 小
  • DDOS攻击

    一 DOS VS DDOS Dos是拒绝服务攻击 而DDOS Distribution Denial of service 是分布式拒绝服务攻击 Dos与DDOS都是攻击目标服务器 网络服务的一种手段 区别 DOS是利用自己的计算机攻击目标
  • 华为android9手机短信不提醒设置,华为手机微信不提醒怎么办 华为收不到微信提示信息多种解决方法...

    到底是哪里出了问题呢 捣鼓了半天 宝宝终于发现了 原来微信收不到消息竟是因为设置有误 有同遭遇的亲们看这里吧 快快get新技能吧 华为收不到微信提示信息多种解决方法 请确认以下事项 确认已开启通知功能 a 开启微信应用内部的通知功能 我 g
  • Spring——动态代理

    动态代理 理解 基于反射机制 掌握程度 1 什么是动态代理 使用jdk的反射机制 创建对象的能力 创建的是代理类的对象 而不用你创建类文件 不用谢java文件 动态 在程序执行时 调用JDK提供的方法才能创建代理类的对象 jdk动态代理 必