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 表达式中明显就
是方法的签名。注意,表达式中加[ ]的部分表示可省略部分,各部分间用空格分开。在其中
可以使用以下符号: 

扫描二维码关注公众号,回复: 1433986 查看本文章


四、AspectJ基于注解的AOP实现

(1)实现步骤

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



2,定义切面POJO类

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

方法。 


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

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


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

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

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


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


6,注册AspectJ的自动代理

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


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


(2)@Pointcut定义切入点

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


五、AspectJ基于XML的实现

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

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

(1)实现步骤

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



2,定义切面POJO类

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

方法。 


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


4,在容器中配置AOP


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

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


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


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



猜你喜欢

转载自blog.csdn.net/king_cannon_fodder/article/details/80211523