AspectJ
AspectJ是eclipse基金会的一个项目 Apache Aspectj,最后一个字母J就是Java的意思
- a seamless aspect-oriented extension to the Java programming language
- Java platform compatible
其相关jar包可在 aspectj下载,下载需要把 aspectj-x.x.x.jar 下载后解压,解压后
在aspectj-x.x.x 的 lib下面会有3个文件
AspectJ相关jar包说明
- aspectjrt.jar包主要是提供 运行时的一些注解,静态方法等等东西,通常我们要使用aspectJ的时候都要使用这个包。
- aspectjtools.jar包主要是提供赫赫有名的 ajc编译器,可以在编译期将java文件或者class文件或者aspect文件定义的切面织入到业务代码中。通常这个东西可以用在ant和maven中定义任务,或者IDE调用。
- aspectjweaverjar包主要是提供了一个java agent用于在 类加载期间织入切面(Load time weaving即LTW)。并且提供了对切面语法的相关处理等基础方法,供ajc使用或者供第三方开发使用。
AspectJ提供了3中方式的代理实现方案
- 编译时织入
利用ajc编译器替代javac编译器,直接将源文件(java或者aspect文件)编译成class文件并将切面织入进代码。 - 编译后织入
利用ajc编译器向javac编译期编译后的class文件或jar文件织入切面代码。 - 加载时织入
不使用ajc编译器,利用aspectjweaver.jar工具,使用java agent代理在类加载期将切面织入进代码。
Spring的JDK动态代理、CGLIB子类代理
这两种方式是在运行时借助
1:JDK 动态代理
2:CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
运行时增强,与上面aspectj的3种aop实现方式时机都不一样;
Spring aop与Aspectj的关系:
1、前者动态代理最终是用的JDK Proxy api或者CGLIB来实现的
2、只是Spring支持了Aspect的注解标签(估计是为了让用户顺滑切换到Aspectj框架),没有依赖原生的aspect编译器;
网上另一个说法:
AspectJ是AOP的祖宗,Spring的注解版参考了AspectJ的实现。