AOP与动态代理

什么是AOP?

  • AOP可以增强方法的功能,而不需要修改原业务代码。
    从编程语言的角度:处理粒度不同
    从设计模式的角度:AOP进一步降低了模块间的耦合度
    从解放程序员生产力的角度:更少的代码
    从代码可读性的角度:业务逻辑更清晰

AOP实现原理:动态代理

非代理

  • 非代理模式,则需要修改原实现类,或者重新定义一个实现类,来添加新的功能要求。

代理模式

  • 代理模式,也需要定义一个实现代理接口的类,但不需要重写原方法,而是组合一个被代理对象。

JDK动态代理

  • JDK动态代理不需要重写实现类,也不需要定义一个实现UserService接口的代理类。而是使用Proxy类帮我们动态生成代理类

Cglib动态代理
var10000.intercept(this, CGLIB$getUser 0 0 0Method, CGLIB e m p t y A r g s , C G L I B emptyArgs, CGLIB emptyArgs,CGLIBgetUser 0 0 0Proxy);

  • this:代理对象;
  • CGLIB$getUser 0 0 0Method 代理方法,可以理解为就是UserServiceImpl中getUser方法;
  • CGLIB$emptyArgs:方法参数;
  • CGLIB$getUser 0 0 0Proxy 一个MethodProxy类型的对象,可以避免使用方法反射

二者区别

  • 使用场景

    • JDK动态代理用于接口 例如,我们要代理UserServiceImpl,则UserServiceImpl必须实现一个接口,例如UserService接口;
    • Cglib用于类或者接口例如,我们要代理UserServiceImpl,不需要关注该类是否实现接口。
  • 效率

    • Java8之前,Cglib效率高;
    • Java8开始,JDK动态代理效率高;

为什么JDK动态代理必须要有接口,而Cglib则不需要

  • 这是由他们的实现方式决定的 JDK动态代理是需要继承接口 java只支持单继承,$Proxy0继承了Proxy类,而Java只有单继承,为了使使用被代理类的地方,都可以透明地使用代理类,只能使得它们拥有共同的接口。所以JDK动态代理只支持接口。

Cglib代理类继承关系

public class UserDaoImpl$$EnhancerByCGLIB$$4a28906a extends UserDaoImpl implements Factory

可以看到代理类并没有继承其他类,而是继承了被代理的类。所以Cglib的方式不关注被代理类是否有接口

效率问题:实现方式不同

  • JDK代理使用了反射,而在之前反射是很“重”的操作
  • Cglib使用了映射,通过方法名查找到对应方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值