AspectJ对AOP的实现

AspectJ对AOP的实现

一、概述

       对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向
切面编程。然而,AspectJ 也实现了 AOP 的功能,且其实现方式更为简捷,使用更为方便,
而且还支持注解式开发。所以,Spring 又将 AspectJ 的对于 AOP 的实现也引入到了自己的框
架中。

二、AspectJ的通知类型

AspectJ中常用的通知类型有五种:

(1)前置通知

(2)后置通知

(3)环绕通知

(4)异常通知

(5)最终通知

其中最终通知是指,无论程序执行是否正常,该通知都会执行。类似于 try..catch 中的
finally 代码块

三、AspectJ的切入点表达式

AspectJ 除了提供了六种通知外,还定义了专门的表达式用于指定切入点。表达式的原
型是: 
execution ( [modifiers-pattern]    访问权限类型 
                    ret-type-pattern    返回值类型 
                    [declaring-type-pattern]    全限定性类名 
                    name-pattern(param-pattern)  方法名(参数名) 
                    [throws-pattern]    抛出异常类型 

                    )

切入点表达式要匹配的对象就是目标方法的方法名。所以,execution 表达式中明显就
是方法的签名。注意,表达式中加[ ]的部分表示可省略部分,各部分间用空格分开。在其中
可以使用以下符号: 

AspectJ对AOP的实现

四、AspectJ基于注解的AOP实现

(1)实现步骤

1,定义业务接口与实现类

AspectJ对AOP的实现

AspectJ对AOP的实现

2,定义切面POJO类

该类为一个 POJO 类,将作为切面出现。其中定义了若干普通方法,将作为不同的通知

方法。 

AspectJ对AOP的实现

3,在切面类上添加@Aspect注解

在定义的 POJO 类上添加@Aspect 注解,指定当前 POJO 类将作为切面。 

AspectJ对AOP的实现

4,在POJO类的普通方法上添加通知注解

切面类是用于定义增强代码的,即用于定义增强目标类中目标方法的增强方法。这些增
强方法使用不同的“通知”注解,会在不同的时间点完成织入。当然,对于增强代码,还要

通过 execution 表达式指定具体应用的目标类与目标方法,即切入点。

AspectJ对AOP的实现

5,注册目标对象与POJO切面类

AspectJ对AOP的实现

6,注册AspectJ的自动代理

在定义好切面 Aspect 后,需要通知 Spring 容器,让容器生成“目标类  +  切面”的代理
对象。这个代理是由容器自动生成的。只需要在 Spring 配置文件中注册一个基于 aspectj 的
自动代理生成器,其就会自动扫描到@Aspect 注解,并按通知类型与切入点,将其织入,并
生成代理。

AspectJ对AOP的实现

7,测试类中使用目标对象的id

AspectJ对AOP的实现

(2)@Pointcut定义切入点

当较多的通知增强方法使用相同的 execution 切入点表达式时,编写、维护均较为麻烦。
AspectJ 提供了@Pointcut 注解,用于定义 execution 切入点表达式。   
其用法是,将@Pointcut 注解在一个方法之上,以后所有的 executeion 的 value 属性值
均可使用该方法名作为切入点。代表的就是@Pointcut 定义的切入点。这个使用@Pointcute
注解的方法一般使用 private 的标识方法,即没有实际作用的方法。   

AspectJ对AOP的实现

五、AspectJ基于XML的实现

AspectJ 除了提供了基于注解的 AOP 的实现外,还提供了以 XML 方式的实现。   
切面就是一个 POJO 类,而用于增强的方法就是普通的方法。通过配置文件,将切面中

的功能增强织入到了目标类的目标方法中。

(1)实现步骤

1,定义业务接口与实现类

AspectJ对AOP的实现

AspectJ对AOP的实现

2,定义切面POJO类

该类为一个 POJO 类,将作为切面出现。其中定义了若干普通方法,将作为不同的通知

方法。 

AspectJ对AOP的实现

3,注册目标对象与POJO切面类

AspectJ对AOP的实现

4,在容器中配置AOP

AspectJ对AOP的实现

配置文件中,除了要定义目标类与切面的 Bean 外,最主要的是在<aop:config/>中进行
aop 的配置。而该标签的底层,会根据其子标签的配置,生成自动代理。 
通过其子标签<aop:pointcut/>定义切入点,该标签有两个属性,id 与 expression。分别

用于指定该切入点的名称及切入点的值。expression 的值为 execution 表达式。  

AspectJ对AOP的实现

通过子标签<aop:aspect/>定义具体的织入规则:根据不同的通知类型,确定不同的织入
时间;将 method 指定的增强方法,按照指定织入时间,织入到切入点指定的目标方法中。   
<aop:aspect/>的 ref 属性用于指定使用哪个切面。   
<aop:aspect/>的子标签是各种不同的通知类型。不同的通知所包含的属性是不同的,但
也有共同的属性。   
method:指定该通知使用的切面中的增强方法。   
pointcut-ref:指定该通知要应用的切入点。   

AspectJ对AOP的实现

5,测试类中使用目标对象的id

AspectJ对AOP的实现