《Spring Recipes》第三章筆記5:Pointcut Expressions

《Spring Recipes》第三章筆記5:Pointcut Expressions


Method Signature Patterns

最經常使用的匹配模式,根據方法的簽名進行匹配。
格式:返回類型模式,方法名模式,方法參數模式仍是必須的,其他的模式均可以省略不寫。
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? name-pattern(param-pattern)
          throws-pattern?)

如:execution(public int com.apress.springrecipes.calculator.ArithmeticCalculator.*(..))
在表達式中,使用*匹配任意字符,使用..匹配任意個參數或者任意包。

Type Signature Patterns

匹配在特定類型中定義的方法。
一、within(com.apress.springrecipes.calculator.*)匹配全部com.apress.springrecipes.calculator包中的類的方法。
二、within(com.apress.springrecipes.calculator.ArithmeticCalculatorImpl)匹配全部com.apress.springrecipes.calculator.ArithmeticCalculatorImpl中方法,若是方面和切入點在同一個包中,能夠省略包名within(ArithmeticCalculatorImpl)。
三、能夠在接口名後添加+來匹配全部實現了該接口的類:within(ArithmeticCalculator+)。
四、能夠定義一個註解,將此註解添加到類上,而後使用within匹配這個註解:
@LoggingRequired
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
...
}

使用表達式:@within(com.apress.springrecipes.calculator.LoggingRequired)匹配ArithmeticCalculatorImpl中全部方法。

Bean Name Patterns

從Spring2.5開始,容器直接使用配置文件中定義的bean的name進行匹配。
注意:值適用於XML配置文件的AOP,不能在AspectJ註解中使用。
bean(*Calculator)

匹配全部已經Calculator結尾的bean。

Combining Pointcut Expressions

AspectJ支持經過&& (and),|| (or),和 ! (not)對錶達式進行組合。

@Aspect 
public class CalculatorPointcuts {
    @Pointcut("within(ArithmeticCalculator+)")
    public void arithmeticOperation() {}

    @Pointcut("within(UnitCalculator+)")
    public void unitOperation() {}

    @Pointcut("arithmeticOperation() || unitOperation()")
    public void loggingOperation() {}
}


Declaring Pointcut Parameters

能夠經過Pointcut Expressions表達式中的特殊符號獲取Pointcut 對象的類型和方法參數。
使用target()獲取target object,使用args()獲取方法參數。
@Aspect 
public class CalculatorPointcuts {
... ...
    @Pointcut("execution(* *.*(..)) && target(target) && args(a,b)")
    public void parameterPointcut(Object target, double a, double b) {}
}


@Aspect 
public class CalculatorLoggingAspect {
... ...
    @Before("CalculatorPointcuts.parameterPointcut(target, a, b)")
    public void logParameter(Object target, double a, double b) {
        log.info("Target class : " + target.getClass().getName());
        log.info("Arguments : " + a + ", " + b);
    }
}
相關文章
相關標籤/搜索