AOP知识点
所属分类 spring
浏览量 1422
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读取中文配置文件