美文网首页
3.1动态代理-第3章aop面向切面编程

3.1动态代理-第3章aop面向切面编程

作者: 努力学习的lfk | 来源:发表于2021-08-20 08:55 被阅读0次

    3.1动态代理

    1.能够实现在原有代码不改动的情况下,通过动态代理能够给原来的类增加一些额外功能。
    2.减少重复代码。
    3.专注业务逻辑代码。
    4.解耦合,让业务功能和非业务功能(日志、事务等)分离。

    动态代理:程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具在程序运行时由JVM根据反射等机制动态生成的。代理对象与目标对象的代理关系在程序运行时才确立。

    3.1.1 JDK动态代理

    使用jdk的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法通过该方法实现。
    从jdk1.3以来,Java语言通过java.lang.reflect包提供三个类支持代理模式Proxy、Method、InvocationHandler

    Method:执行目标类的方法,通过Method类实现

    实现步骤:
    1)创建目标类,SomeServiceImpl目标类,给它的doSome、doOther增加时间、事务。

    2)创建InvocationHandler接口的实现类,在这个类实现给目标方法增加的功能。

    创建变量保存目标对象.png
    执行目标对象
    method.invoke(目标对象,args);
    
    通过Method类实现,执行目标类的方法.png 记录执行方法的返回值.png 创建工具类.png 新增功能.png

    3)使用jdk中类Proxy,创建代理对象。实现创建对象的能力。

    在InvocationHandler接口的实现类,保存目标对象 创建目标对象 创建IncationHandler对象.png
    使用Proxy创建代理,语法:
         Proxy.newProxyInstance(目标对象.getClass().getClassLoader(),目标对象.getClass().getInterfaces(),InvocationHandler对象);  
    
    创建Proxy对象.png Proxy对象强制类型转换.png 通过代理执行方法.png

    若只想让某个方法增加功能,可在InvocationHandler接口的实现类中,进行判断

    指定某个方法实现动态代理.png equals与==的区别.png

    3.1.2 CGLIB动态代理

    第三方的工具库,创建代理对象,原理是继承。通过继承生成目标类的子类,在子类中通过重写父类的方法,来实现功能的增强(类能继承就行,不需要接口)

    要求目标类不能是final类型的,因为final类型的类不能被继承、final类型的方法不能被子类重写


    笔记来源:B站动力节点 spring学习视频

    视频链接:https://www.bilibili.com/video/BV1nz4y1d7uy

    相关文章

      网友评论

          本文标题:3.1动态代理-第3章aop面向切面编程

          本文链接:https://www.haomeiwen.com/subject/ozgrpltx.html