学习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):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的逻辑。

相关推荐
HalvmånEver3 分钟前
盛最多水的容器:双指针法的巧妙运用(leetcode 11)
c++·学习·leetcode
雷达学弱狗25 分钟前
python反转字符串
开发语言·python
励志不掉头发的内向程序员28 分钟前
STL库——stack/queue(类函数学习)
开发语言·c++·学习
努力努力再努力wz32 分钟前
【c++进阶系列】:万字详解异常
java·linux·运维·服务器·开发语言·c++
工一木子35 分钟前
Java多线程基础:进程、线程与线程安全实战
java·多线程
Peter_Deng.1 小时前
C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region
c语言·开发语言
渣哥1 小时前
阻塞 vs 非阻塞:IO 与 NIO 的正面对决
java
编啊编程啊程1 小时前
响应式编程框架Reactor【7】
java·spring boot·spring cloud·java-ee·maven
fhgfyrsg1 小时前
synchronized的锁对象 和 wait,notify的调用者之间的关系
java·开发语言
~kiss~1 小时前
MCP SDK 示例一
学习