AspectJ切点指示器03execution

编程

execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)

<修饰符模式>? :如 public,可选

<返回类型模式> :如 String,可以是 * 表示任意的返回值都可以匹配

<方法名模式> :如 com.test.aspectj.expression.Factory.* 表示Factory中的所有的方法

(<参数模式>) :如 (..) 表示任意类型参数且参数个数不限

<异常模式>? :可选

execution(* com.test.aspectj.expression.Factory.*(..)) 解释如下:

第一个 * :表示任意的方法返回值类型

com.test.aspectj.expression.Factory.* :表示Factory中的所有的方法

(..) :表示任意类型参数且参数个数不限

其他用法举例

表达式

功能描述

execution(public * *(..))

匹配所有目标类的所有public方法

execution(* pre*(...))

匹配所有目标类所有以pre为前缀的方法

execution(* com.test.Factory.*(..))

匹配Factory中的所有方法

类模式表达式中的 .*

匹配包中的所有类,不包括子孙包中的类

类模式表达式中的 ..*

匹配包中以及子孙包中的所有类

方法入参表达式中的 *

匹配任意类型参数

方法入参表达式中的 **

匹配任意类型参数且参数不限个数

execution(* make(int,String))

匹配 make(int,String)方法

本示例各个类最终结构图如下:

1、Factory

package com.test.aspectj.expression;

/**

* 工厂接口

*/

public interface Factory {

// 制作产品

void make();

// 运输

void delivery(String address);

}

2、PhoneFactory

package com.test.aspectj.expression;

import com.test.aspectj.expression.annotation.Log;

import org.springframework.stereotype.Component;

/**

* 手机工厂

*/

@Component

public class PhoneFactory implements Factory {

// 制作产品的方法,注意有@Log注解

@Override

@Log

public void make() {

System.out.println("来自目标类PhoneFactory的消息:生产手机");

}

// 运输手机的方法

@Override

public void delivery(String address) {

System.out.println("来自目标类PhoneFactory的消息:运输手机至 " + address);

}

}

3、FoodFactory

package com.test.aspectj.expression;

import com.test.aspectj.expression.args.FreshFoodFactory;

import com.test.aspectj.expression.args.FrozenFoodFactory;

import org.springframework.stereotype.Component;

/**

* 食品工厂

*/

@Component

public class FoodFactory implements Factory {

// 制作产品的方法

@Override

public void make() {

System.out.println("来自目标类FoodFactory的消息:生产食品");

}

// 运输

@Override

public void delivery(String address) {

System.out.println("来自目标类FoodFactory的消息:销售食品至 " + address);

}

}

4、切面类 ExecutionAspect,execution 代码示例

package com.test.aspectj.expression.execution;

import org.aspectj.lang.annotation.AfterReturning;

import org.aspectj.lang.annotation.Aspect;

import org.springframework.stereotype.Component;

/**

* 使用execution 来为所有Factory接口的实现类织入增强

*/

@Aspect

public class ExecutionAspect {

/**

* execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)

* <修饰符模式>? :如 public,可选

* <返回类型模式> :如 String,可以是 * 表示任意的返回值都可以匹配

* <方法名模式> :如 com.test.aspectj.expression.Factory.* 表示Factory中的所有的方法

* (<参数模式>) :如 (..) 表示任意类型参数且参数个数不限

* <异常模式>? :可选

*

* execution(* com.test.aspectj.expression.Factory.*(..)) 解释如下:

* 第一个 * :表示任意的方法返回值类型

* com.test.aspectj.expression.Factory.* :表示Factory中的所有的方法

* (..) :表示任意类型参数且参数个数不限

*/

@AfterReturning("execution(* com.test.aspectj.expression.Factory.*(..))")

public void make() {

System.out.println("来自切面里的消息:make方法执行了");

}

}

5、xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com.test.aspectj.expression"/>

<bean id="annotationAspect" class="com.test.aspectj.expression.execution.ExecutionAspect"/>

<aop:aspectj-autoproxy/>

</beans>

6、测试代码

package com.test.aspectj.expression.execution;

import com.test.aspectj.expression.Factory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**

* 测试execution增强

*/

public class AspectJExpressionDemo {

public static void main(String[] args) {

System.out.println("=============== 测试 execution ===============");

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-chapter3-aspectjexecutionexpression.xml");

Factory foodFactory = (Factory) context.getBean("foodFactory");

foodFactory.make();

System.out.println("-----分割线-----");

Factory phoneFactory = (Factory) context.getBean("phoneFactory");

phoneFactory.make();

}

}

7、运行结果

=============== 测试 execution ===============

来自目标类FoodFactory的消息:生产食品

来自切面里的消息:make方法执行了

-----分割线-----

来自目标类PhoneFactory的消息:生产手机

来自切面里的消息:make方法执行了

8、结论

如果想匹配某个包或者子包下的所有类的所有方法,可以用这个切入点模式。
 

以上是 AspectJ切点指示器03execution 的全部内容, 来源链接: utcz.com/z/513080.html

回到顶部