IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring学习记录--------AOP面向切面编程的思想(动态代理) -> 正文阅读

[Java知识库]Spring学习记录--------AOP面向切面编程的思想(动态代理)

动态代理的原理

代理设计模式的原理:使用一个代理将原本对象包装起来,然后用该代理对象”取代”原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。

实现原理
?? ?jdk动态代理
?? ??? ?主要通过Proxy.newProxyInstance()和InvocationHandler这两个类和方法实现
?? ??? ?实现过程
?? ??? ??? ?创建代理类proxy实现Invocation接口,重写invoke()方法
?? ??? ??? ??? ?调用被代理类方法时默认调用此方法
?? ??? ??? ?将被代理类作为构造函数的参数传入代理类proxy
?? ??? ??? ?调用Proxy.newProxyInsatnce(classloader,interfaces,handler)方法生成代理类
?? ??? ??? ??? ?生成的代理类
?? ??? ??? ??? ??? ?$Proxy0 extends Proxy implements Person
?? ??? ??? ??? ??? ?类型为$Proxy0
?? ??? ??? ??? ??? ?因为已经继承了Proxy,所以java动态代理只能对接口进行代理
?? ??? ??? ??? ?代理对象会实现用户提供的这组接口,因此可以将这个代理对象强制类型转化为这组接口中的任意一个
?? ??? ??? ??? ?通过反射生成对象
?? ??? ??? ?总结: 代理类调用自己方法时,通过自身持有的中介类对象来调用中介类对象的invoke方法,从而达到代理执行被代理对象的方法。
?? ?cglib
?? ??? ?生成对象类型为Enhancer
?? ??? ?实现原理类似于 jdk 动态代理,只是他在运行期间生成的代理对象是针
对目标类扩展的子类
?? ?静态代理
?? ??? ?缺点
?? ??? ??? ?如果要代理一个接口的多个实现的话需要定义不同的代理类
?? ??? ??? ?代理类 和 被代理类 必须实现同样的接口,万一接口有变动,代理、被代理类都得修改
?? ??? ?在编译的时候就直接生成代理类
?? ?JDK动态代理和cglib的对比
?? ??? ?CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高
?? ??? ??? ?1.6和1.7的时候,CGLib更快
?? ??? ??? ?1.8的时候,jdk更快
?? ??? ?CGLib在创建对象的时候所花费的时间却比JDK动态代理多
?? ??? ?singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反之,则适合用JDK动态代理
?? ??? ?JDK动态代理是面向接口的,CGLib动态代理是通过字节码底层继承代理类来实现(如果被代理类被final关键字所修饰,那么会失败)
?? ??? ?JDK生成的代理类类型是Proxy(因为继承的是Proxy),CGLIB生成的代理类类型是Enhancer类型
?? ??? ?如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);
如果要被代理的对象不是实现类,那么Spring会强制使用CGLib来实现动态代理。 

public class LoggingProxy {
    //被代理的对象
    private Object target;
    public LoggingProxy(Object target){
        this.target=target;
    }
    public Object getProxy(){
        //获取被代理对象的类加载器
        ClassLoader classLoader=target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        Object proxy= Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            /**
             * 参数的说明
             * invoke方法说明就是要执行的扩展的攻难
             * proxy:传入的被代理的对象
             * method:调用的方法
             * args:调用方法时候传入的参数
             * @param proxy
             * @param method
             * @param args
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                String name = method.getName();
                System.out.println("====Logging: the method" +name+"begin with " + Arrays.toString(args));
                //执行目标的方法即将方法的调用转到被代理的对象上
                Object result = method.invoke(target, args);
                System.out.println("====Logging: the method"+name+"returns"+result);
                return result;
            }
        });
        return proxy;
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:07:36  更:2022-03-16 22:09:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:42:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码