技术开发 频道

基于@AspectJ配置Spring AOP(之二)



    概述

    【IT168 专稿】在《基于@AspectJ配置Spring AOP(之一)》的文章中,我们讲解基于@AspectJ Spring AOP的基础知识,在本文中,我们将继续学习@AspectJ一些高级的知识。@AspectJ可以使用逻辑运算符对切点进行复合运算得到复合的切点;为了在切面中重用切点,我们还可以对切点进行命名,以便在其它的地方引用定义过的切点;当一个连接点匹配多个切点时,需要考虑织入顺序的问题;此外,一个重要的问题是如何在增强中访问连接点上下文的信息。

    切点复合运算
    使用切点复合运算符,我们将拥有强大而灵活的切点表达能力,以下是一个使用了复合切点的切面:
    代码清单 7 TestAspect:切点复合运算
package com.baobaotao.aspectj.advanced; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class TestAspect { @After("within(com.baobaotao.*) " + " && execution(* greetTo(..)))") ①与运算 public void greeToFun() { System.out.println("--greeToFun() executed!--"); } @Before(" !target(com.baobaotao.NaiveWaiter) "+ "&& execution(* serveTo(..)))") ②非与运算 public void notServeInNaiveWaiter() { System.out.println("--notServeInNaiveWaiter() executed!--"); } @AfterReturning("target(com.baobaotao.Waiter) || "+ " target(com.baobaotao.Seller)") ③或运算 public void waiterOrSeller(){ System.out.println("--waiterOrSeller() executed!--"); } }
    在①处,我们通过&&运算符定义了一个匹配com.baobaotao包中所有greetTo方法的切点;在②处,我们通过!和&&运算符定义了一个匹配所有serveTo()方法并且该方法不位于NaiveWaiter目标类的切点;在③处,我们通过||运算符定义了一个匹配Waiter和Seller接口实现类所有连接点的切点。
0
相关文章