首页   快速返回

AOP知识点     所属分类 spring
AOP常见实现
Spring AOP
Aspectj
Guice AOP
Jboss AOP

AOP Alliance   定义了AOP中的基础概念 提供统一的接口


Spring AOP 和 Aspectj的区别

Spring AOP 使用动态代理 ,运行期生成代理类 ,不修改原来的类 .
Aspectj 使用 编译期字节码织入(weave),编译的直接修改类的字节码,把定义的切面代码逻辑插入到目标类中。
Spring AOP可以对其它模块正常编译出的代码起作用,Aspectj 需要对其它模块使用acj重新编译
Spring AOP 对于直接调用类内部的其它方法无效(需要获取对应的代理类来调用),声明为 final 的 类 和 方法 不支持,Aspectj没有这些限制
Spring AOP使用XML配置的方式定义切入点(CutPoint) ,spring aop 也支持使用 @Aspect 注解 ,Aspectj使用注解方式

注: Aspectj 除了编译期静态织入,也支持加载时动态织入修改类的字节码。

Spring AOP使用JDK Proxy或者cglib 生成代理类。实现接口的类使用JDK Proxy,否则使用cglib

aop:aspectj-autoproxy proxy-target-class="true"
@EnableAspectJAutoProxy(proxyTargetClass=true)

proxyTargetClass=true  , 强制使用 cglib 代理


JDK Proxy只适用于类实现了接口的情况
生成的代理类实现了原类的接口,但和原类没有继承关系. 
cglib 生成原来的子类  ,final 类 不支持继承


spring 使用 aspect注解 ,需要依赖 aspectjweaver.jar
用了aspectjweaver.jar中定义的一些annotation和class,但是并不使用Aspectj的字节码织入功能。
底层实现还是基于 jdk代理和 cglib

上一篇     下一篇
spring5模块介绍

spring aop 与 aspectj的区别和联系

基于Aspect注解的spring aop 实例

spring aop 内部方法调用拦截说明

spring aop cglib 代理类源码查看

Properties使用UTF8读取中文配置文件