String AOP的原理实现
1. 基本原理
Spring的AOP是通过动态代理实现的。
如果我们为Spring的某个bean配置了切面,那么Spring在创建这个bean的时候,实际上创建的是这个bean的一个代理对象。我们后续对bean中方法的调用,实际上调用的是代理类重写的代理方法。
而Spring的AOP使用了两种动态代理,分别是JDK的动态代理,以及CGLib的动态代理。
2. 两种动态代理的方式的区别
2.1 JDK动态代理
2.1.1 定义和应用场景
如果目标类实现了接口,Spring AOP会选择使用JDK动态代理目标类。
JDK动态代理的代理类根据目标类实现的接口动态生成,不需要自己编写。
生成的动态代理类和目标类都实现相同的接口。
2.1.2 核心
JDK动态代理的核心是InvocationHandler接口和Proxy类。
2.1.3 缺点
JDK动态代理的缺点是:目标类必须有实现的接口。
如果某个类没有实现接口,那么这个类就不能用JDK动态代理。
2.2 CGLIB动态代理
2.2.1 简介
如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。
CGLIB, 英文全称,Code Generation Library
可以在运行时动态生成类的字节码,动态创建目标类的子类对象,在子类对象中增强目标类。
CGLIB是通过继承的方式实现的动态代理。
因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
2.2.2 优点
目标类不需要实现特定的接口,更加灵活。
2.3 两种动态代理的选择
- 如目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP,但是可以强制使用CGLIB实现AOP。
- 如果目标对象没有实现接口,必须使用CGLIB动态代理。
参考资料:Spring AOP的实现原理?