第二十二章 Spring AOP⾥⾯的代理知识

1.静态代理和动态代理

  • 什么是代理
    为某⼀个对象创建⼀个代理对象,程序不直接⽤原本的对象,⽽是由创建的代理对象来控制对原对象,通过代理类这中间⼀层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间
    A ->B-> C
  • 什么是静态代理
    由程序创建或特定⼯具⾃动⽣成源代码,在程序运⾏前,代理类的.class⽂件就已经存在
  • 什么是动态代理
    在程序运⾏时,运⽤反射机制动态创建⽽成,⽆需⼿动编写代码
    JDK动态代理      CGLIB动态代理

2.代理模式实战之静态代理

  • 什么是静态代理
    由程序创建或特定⼯具⾃动⽣成源代码,在程序运⾏前,代理类的.class⽂件就已经存在
    通过将⽬标类与代理类实现同⼀个接⼝,让代理类持有真实类对象,然后在代理类⽅法中调⽤真实类⽅法,在调⽤真实类⽅法的前后添加我们所需要的功能扩展代码来达到增强的⽬的
  • 优点
    代理使客户端不需要知道实现类是什么,怎么做的,⽽客户端只需知道代理即可
    ⽅便增加功能,拓展业务逻辑
  • 缺点
    代理类中出现⼤量冗余的代码,⾮常不利于扩展和维护
    如果接⼝增加⼀个⽅法,除了所有实现类需要实现这个⽅法外,所有代理类也需要实现此⽅法。增加了代码维护的复杂度
    在这里插入图片描述

3.AOP的实现策略之JDK动态代理

  • 什么是动态代理
    在程序运⾏时,运⽤反射机制动态创建⽽成,⽆需⼿动编写代码
    JDK动态代理与静态代理⼀样,⽬标类需要实现⼀个代理接⼝,再通过代理对象调⽤⽬标⽅法
  • 实操
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.AOP的实现策略之CGLib动态代理

  • 什么是动态代理
    在程序运⾏时,运⽤反射机制动态创建⽽成,⽆需⼿动编写代码
    CgLib动态代理的原理是对指定的业务类⽣成⼀个⼦类,并覆盖其中的业务⽅法来实现代理
    在这里插入图片描述在这里插入图片描述

5.CGLib动态代理和JDK动态代理总结

  • 动态代理与静态代理相⽐较,最⼤的好处是接⼝中声明的所有⽅法都被转移到调⽤处理器⼀个集中的⽅法中处理,解耦和易维护
  • 两种动态代理的区别
    • JDK动态代理:要求⽬标对象实现⼀个接⼝,但是有时候⽬标对象只是⼀个单独的对象,并没有实现任何的接⼝,这个时候就可以⽤CGLib动态代理
    • CGLib动态代理,它是在内存中构建⼀个⼦类对象从⽽实现对⽬标对象功能的扩展
    • JDK动态代理是⾃带的,CGlib需要引⼊第三⽅包
    • CGLib动态代理基于继承来实现代理,所以⽆法对final类、private⽅法和static⽅法实现代理
  • Spring AOP中的代理使⽤的默认策略
    • 如果⽬标对象实现了接⼝,则默认采⽤JDK动态代理
    • 如果⽬标对象没有实现接⼝,则采⽤CgLib进⾏动态代理
    • 如果⽬标对象实现了接扣,程序⾥⾯依旧可以指定使⽤CGlib动态代理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值