@AspectJ怎么在Spring AOP 中使用
导读:本文共7591.5字符,通常情况下阅读需要25分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: @AspectJ可以使用切点函数定义切点,我们还可以使用逻辑运算符对切点进行复核运算得到复合的切点,为了在切面中重用切点,我们还可以对切点进行命名,以便在其他的地方引用定义过的切点。当一个连接点匹配多个切点时,需要考虑织入顺序的问题,此外一个重要的问题是如何再增强中访问连接点上下文的信息。Waiter接口:packagecom.yyq.aspectJAdvanc... ...
目录
(为您整理了一些要点),点击可以直达。@AspectJ可以使用切点函数定义切点,我们还可以使用逻辑运算符对切点进行复核运算得到复合的切点,为了在切面中重用切点,我们还可以对切点进行命名,以便在其他的地方引用定义过的切点。
当一个连接点匹配多个切点时,需要考虑织入顺序的问题,此外一个重要的问题是如何再增强中访问连接点上下文的信息。
Waiter接口:
NaiveWaiter实现类:
NaughtyWaiter实现类:
Seller接口:
SmallSeller实现类:
beans.xml配置文件:
使用切点符合运算符,我们将拥有强大而灵活的切点表达能力。
TestAspect:切点符合运算定义切面
测试方法:
输出结果:
切点直接声明在增强方法处被称为匿名切点,匿名切点只能在声明处使用。如果希望在其他地方重用一个切点,我们可以通过@Pointcut注解以及切面类方法对切点进行命名。
TestNamePointcut:命名切点类
TestAspect2:切面实现类
测试方法:
输出结果:
一个连接点可以同时匹配多个切点,切点对应的增强在连接点上的织入顺序的安排主要有以下3种情况:
1)如果增强在同一个切面类中声明,则依照增强在切面类中定义的顺序进行织入;
2)如何增强位于不同的切面类中,且这些切面类都实现了org.springframework.core.Order接口,则由接口方法的顺序号决定(顺序号小的先织入);
3)如果增强位于不同的切面类中,且这些切面类没有实现org.springframework.core.Order接口,织入的顺序是不确定的。
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口,任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。
TestAspect3:切面实现类
测试方法:
输出结果:
args()用于绑定连接点方法的入参;@annotation()用于绑定连接点方法的注解对象;而@args()用于绑定连接点方法入参的注解。
TestAspect4:切面实现类
测试方法:
输出结果:
使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方法中同名入参的类型间接决定罢了。
TestAspect5:切面实现类
测试方法:
输出结果:
@within()和@target()函数可以将目标类的注解对象绑定到增强方法中,我们通过@within()演示注解绑定的操作。
TestAspect6:切面测试类
测试方法:
输出结果:
在后置增强中,我们可以通过returning绑定连接点方法的返回值。
TestAspect7:切面实现类
测试方法:
输出结果:
和通过切点函数绑定连接点信息不同,连接点抛出的异常必须使用AfterThrowing注解的throwing成员进行绑定。
TestAspect8:切面实现类
测试方法:
输出结果:
@AspectJ怎么在Spring AOP 中使用的详细内容,希望对您有所帮助,信息来源于网络。