继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

基于注解的Spring AOP开发--定义切入点函数

慕的地10843
关注TA
已关注
手记 1081
粉丝 200
获赞 961

定义切入点函数时,可以直接把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..*)

当切口为:


webp

image.png

情形:testFruit是fruit的子类

测试代码:


webp

image.png

测试结果:


webp

image.png

结论:
说明+通配符可以匹配指定类及其子类中的所有方法。

匹配符:
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通知代码如下:


webp

image.png

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


webp

image.png

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


webp

image.png


可以看出,有返回值的时候,会执行AfterRetuning通知,并且该通知在After通知之后执行

使用环绕通知@Around,代码如下:


webp

image.png


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


webp

image.png

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



作者:代码potty
链接:https://www.jianshu.com/p/5eddfdb97432


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP