• 学习java第五十二天


    JDK动态代理和CGLIB动态代理的区别?

    Spring AOP中的动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。

    JDK动态代理

    如果目标类实现了接口,Spring AOP会选择使用JDK动态代理目标类。代理类根据目标类实现的接口动态生成,不需要自己编写,生成的动态代理类和目标类都实现相同的接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。

    缺点:目标类必须有实现的接口。如果某个类没有实现接口,那么这个类就不能用JDK动态代理。

    CGLIB来动态代理

    通过继承实现。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library)可以在运行时动态生成类的字节码,动态创建目标类的子类对象,在子类对象中增强目标类。

    CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

    优点:目标类不需要实现特定的接口,更加灵活。

    什么时候采用哪种动态代理?

    如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

    如果目标对象实现了接口,可以强制使用CGLIB实现AOP

    如果目标对象没有实现了接口,必须采用CGLIB库

    两者的区别:

    jdk动态代理使用jdk中的类Proxy来创建代理对象,它使用反射技术来实现,不需要导入其他依赖。cglib需要引入相关依赖:asm.jar,它使用字节码增强技术来实现。

    当目标类实现了接口的时候Spring Aop默认使用jdk动态代理方式来增强方法,没有实现接口的时候使用cglib动态代理方式增强方法。

    Spring通知有哪些类型?

    在AOP术语中,切面的工作被称为通知。通知实际上是程序运行时要通过Spring AOP框架来触发的代码段。

    Spring切面可以应用5种类型的通知:

    前置通知(Before):在目标方法被调用之前调用通知功能;

    后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

    返回通知(After-returning ):在目标方法成功执行之后调用通知;

    异常通知(After-throwing):在目标方法抛出异常后调用通知;

    环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的逻辑。

  • 相关阅读:
    数据迁移工具(数据库之间进行数据库迁移所使用的工具及迁移流程。)
    【高德地图在React项目中的使用——(二)各种配置的使用】
    【WLAN】【测试】如何使用MacBook进行WiFi无线空口抓包
    Acwing/3359. 更多奇怪的照片
    [C++](17)数据结构:二叉搜索树的操作与实现
    Radiobutton 点击选中之后再点击取消选中最简单的实现方式
    驱动开发:通过PIPE管道与内核层通信
    用边缘计算网关解决离散行业数采问题-天拓四方
    如何把项目部署到云服务器
    进程,线程切换
  • 原文地址:https://blog.csdn.net/qq_40694812/article/details/138203008