Spring AOP 漫游指南

Spring AOP 漫游指南

对于切面编程,有一个目标对象(targetObject),也有一个代理对象(proxyObject),目标对象是我们声明的业务逻辑对象,而代理对象是使用切面逻辑对业务逻辑进行包裹之后生成的对象。

如果使用的是 Jdk 动态代理,那么业务对象和代理对象将是两个对象,在调用代理对象逻辑时,其切面逻辑中会调用目标对象的逻辑;

如果使用的是 Cglib 代理,由于是使用的子类进行切面逻辑织入的,那么只有一个对象,即织入了代理逻辑的业务类的子类对象,此时是不会生成业务类的对象的。

简单理解:jdk 动态代理根据接口生成两个对象,这两个对象都实现了同一个接口。

Cglib 代理生成了织入了代理逻辑的业务类的子类对象,只有一个对象。可以认为目标对象和代理对象是同一个。

this() target()

this 语义:如果当前对象生成的代理对象符合 this 指定的类型,那么就为其织入切面逻辑。

target 语义:如果当前对象符合 target 指定的类型,那么就为其织入切面逻辑。

this(SomeClass) 或 target(SomeClass),这里 SomeClass 实现了某个接口 SomeInterface.jdk 代理生成的代理对象的类型只是实现了 SomeInterface,并不是SomeClass,语义不符合;而target目标对象本身就是 SomeClass 类型,所以语义符合。

但是,如果改变 Spring 默认采用的 JDK 代理模式,改为 CGlib 代理模式。那么 CGlib 生成的代理对象是继承了 SomeClass,根据“is-a”,this 语义也符合。

AOP 基础概念

多谢支持