AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,这实际上提供了非常广阔的发展的空间。笔者第一次接触AOP概念是在做分销资源系统中所接触的,但是那时只是对它的一个模糊认识,是通过学习动态代理来认识AOP详细可见笔者之前的文章说说动态代理.而通过对Spring的学习,对AOP有了进一步的了解和认识.
因为AOP是一个概念和规范,所以它需要有自己的实现,而AspectJ是AOP的一个很悠久的实现,它能够和Java 配合起来使用。
接下来需要对AspectJ中的几个重要的概念进行初步了解.
Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些Pointcut 以及相应的 Advice。
Joint point:表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
Pointcut:表示一组 jointpoint,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
Weave:将Advice应用到Target Object上的过程叫织入,spring支持动态织入.
Target Object:Advice被应用的对象
Proxy:SpringAOP类默认使用JDK的动态代理,它的代理是在运行时创建,也可以使用CGLIB代理
上面关于AspectJ的概念单独的进行理解有些困难和乏味.下面通过一个图将上面的概念串下来,如下图.
上面提到SpringAOP类默认使用JDK的动态代理,它的代理是在运行时创建,也可以使用CGLIB代理,那么下面对JDK_AOP动态代理实现跟CGLIB的代理实现有差别进行对比和总结.
1、如果目标对象实现了接口,在默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,也可以强制使用CGLIB生成代理实现AOP
3、如果目标对象没有实现接口,那么必须引入CGLIB,spring会在JDK的动态代理和CGLIB代理之间切换.
以上是对AOP的实现AspectJ的相关概念进行了解,接下来将同一个实例来演示如何在项目中运用AspectJ.