定义切入点函数时,可以直接把execution已定义匹配表达式作为值传递给通知类型
例如:
@Before("execution(* org.music.impl.*.*(..))")
还可以采用与ApectJ中使用pointcut关键字类似的方式定义切入点表达式如下:
@Pointcut("execution(* org.music.impl.*.*(..))")
public void point(){}
@Before("point()")
public void FruitBefore(){
logger.info("before");
}
切入点指示符:
在定义匹配表达式时,有* ..和+三类的通配符
“..” :匹配方式定义中的任意数量的参数,此外还匹配类定义中的任意数量包
"+" :匹配给定类的任意子类
" * " :匹配任意数量的字符
例如
//匹配com.zejian.service包及其子包中所有类的所有方法
within(com.zejian.service..*)
当切口为:

情形:testFruit是fruit的子类
测试代码:

测试结果:

结论:
说明+通配符可以匹配指定类及其子类中的所有方法。
匹配符:
1、execution:匹配方法执行连接点
2、within:匹配某些类型中的连接点
3、bean:Spring AOP扩展的,AspectJ没有对于它的指示符,用于匹配特定名称的bean对象的执行方法
e.g
@Pointcut("bean(*Service)")
匹配名称中带有后缀Service的bean
4、this:用于匹配当前AOP代理对象类型的执行方法
e.g:
@Pointcut("this(com.zajian.spring.dao.UserDao)")
匹配任意实现了UserDao接口的代理对象的方法进行过滤
5、target:用于匹配当前目标对象类型的执行方法
6、@within:用于匹配所有持有指定注解类型内的方法;与within是有区别的,within是用于匹配指定类型内的方法执行,而@within是指定注解类型内的方法
e.g:
@Pointcut("@within(com.zejian.MarkerAnnotation)")
匹配使用了MarkerAnnotation注解的类
7、@annotation:根据所应用的注解进行方法过滤
e.g:
@Pointcut("@annotation(com.zejian.MarketAnnotation)")
匹配使用了MarkerAnnotation注解的方法
Spring AOP通知的五个方法
1、Before
2、After
3、AfterReturning
4、AfterThrowing
5、Around
当参数只有一个的时候,可以不写value,否则要写value
现在对这几种方法进行测试
AOP通知代码如下:

当没有返回值时,AOP动态代理的测试结果如下

当匹配方法有返回值时,测试结果如下:

可以看出,有返回值的时候,会执行AfterRetuning通知,并且该通知在After通知之后执行
使用环绕通知@Around,代码如下:

测试代码相同,测试结果如下图所示:

也就是说这种环绕通知可以在目标方法前执行也可以在目标方法之后执行,更重要的是环绕通知可以控制目标方法是否指向执行。
ProceedJoinPoint.proceed()方法是执行目标函数的方法,方法的返回值就是环绕通知的返回值。
网友评论