• AOP基本概念-静态代理、动态代理、CHLIB代理


     代理模式

      好处,可以在目标对象实现的基础上,增加额外的功能的操作,扩展目标对象的功能。

    原来的代码---

    现在想要扩展功能----

    1.静态代理

      保存数据到数据库

        假如不用aop代理,就只有修改原来的UserDao,添加事务的代码。

      

      Dao直接保存

        添加事务

        现在,添加代理类(静态代理),目标对象UserDao,所以代理类中有一个属性是目标对象UserDao userDao

        代理对象要实现与目标对象一样的接口

        

        使用 

         

      优点:可以不修改目标对象功能的前提下,对目标对象扩展

      缺点:

        因为代理对象需要实现与目标对象相同的接口,会有很多的代理类

        如果接口增加新的方法,目标对象代理对象都需要做更改

      解决方式:

        代理工厂

        动态代理

    2.动态代理

      代理对象不需要实现接口,目标对象需要实现接口

      代理对象生成,使用到JDKAPI,动态的在内存中创建代理对象

      动态代理也叫JDK代理(接口代理)

      API中

         Proxy.class

          public static Object newProxyInstance();

            参数1:ClassLoader 指定当前目标对象的使用类的加载器

            参数2:Class<?>[] interfaces,目标对象实现的接口类型(虽然不需要实现接口,但是在动态创建的时候还是需要知道你的接口类型,真正的代理对象实际上实现了这个接口)

            参数3:InvocationHandler 事件处理器(调用某一个事件的时候,它会回调内部的方法,帮我们返回代理对象)

    JDK的Proxy源代码粗略浏览

      代理类 这儿的目标对象的类型声明为Object类型,按照本次需求按理说类型应该是IUserDao,但是以后如果有相应的其他接口,又必须重新实现。

     使用

    当接口新增方法使,目标对象需要做更改,代理对象不需要修改

    接口新增update()方法

    目标对象修改

    代理对象不修改

    使用 

      调用update()方法即可

      

    3.CGLIB代理

      解决目标对象没有实现接口的情况

      子类代理,在内存中构建一个子类对象从而实现对哦目标对象的扩展

      CGLIB许多AOP框架使用

      步骤:

        引用jar文件。--spring-core包已经使用了CGLIB的jar包

        在内存中动态创建的子类

        目标对象不可以是final

        目标对象的方法使final、static,则不会拦截

    在spring AOP编程中

      如果加入容器中的目标对象有实现接口,用JDK代理

      如果目标对象没有实现接口,用cglib代理

      代理类ProxyFactory实现MethodInterceptor接口(拦截器)

    使用

     -----------------------------------------------------------------------------------------------------------------------------

    目标类UserDao

    关注点MyAop

    目标类变为,去掉关注点代码(MyAop的方法),让代理类来实现

    代理类

      

    xml文件

     使用

      

  • 相关阅读:
    进程间通信-管道,消息,共享内存,信号量,信号,scoket
    高并发架构相关概念
    在WSL2中 安装 .NET Core SDK 进行Linux 开发工作
    OKR专题
    logback是怎么知道java代码的行数的?
    IDEA plugins
    [LeetCode] 956. Tallest Billboard 最高的广告牌
    上周热点回顾(8.10-8.16)团队
    【故障公告】腾讯云短信服务故障造成无法发送手机短信团队
    HBase~hbase-shaded-client解决包冲突问题
  • 原文地址:https://www.cnblogs.com/sunupo/p/10655823.html
Copyright © 2020-2023  润新知