String AOP的原理实现

Spring的AOP机制基于动态代理,它能创建目标bean的代理对象,调用方法时实现代理逻辑。JDK动态代理适用于目标类实现接口的情况,通过InvocationHandler和Proxy实现。若目标类无接口,CGLIB则通过继承生成子类进行代理,更具有灵活性,但不能代理final类。
摘要由CSDN通过智能技术生成

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 两种动态代理的选择

  1. 如目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP,但是可以强制使用CGLIB实现AOP。
  2. 如果目标对象没有实现接口,必须使用CGLIB动态代理。

参考资料Spring AOP的实现原理?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值