前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AOP高级用法——获取方法的参数和返回值

AOP高级用法——获取方法的参数和返回值

作者头像
Java深度编程
发布2020-06-10 09:23:38
13.6K0
发布2020-06-10 09:23:38
举报
文章被收录于专栏:Java深度编程

我们平时在使用springAop的时候,经常是将某一个方法定义为一个切入点,用来做前置,后置或环绕增强,但如果想得到切入点方法的参数,以及它的返回值就需要做一些特定的配置。

普通的切面如下:

代码语言:javascript
复制
@Configuration
@Aspect
public class UserInfoAspect {
    @Pointcut("execution(* com.*.test(*))")
    public void test() {}

    @AfterReturning(value = "test()"")
    public void logMethodCall() throws Throwable {
        System.out.println("进入后置增强了!");
    }
}

获取切入点方法的参数:

代码语言:javascript
复制
@Configuration
@Aspect
public class UserInfoAspect {
    @Pointcut("execution(* com.*.test(*))")
    public void test() {}
    
    //使用JoinPoint 对象可以接收到切入点方法的参数
    @AfterReturning(value = "test()")
    public void logMethodCall(JoinPoint jp) throws Throwable {

        System.out.println("进入后置增强了!");
        String name = jp.getSignature().getName();
        System.out.println(name);

        Object[] args = jp.getArgs();
        for (Object arg : args) {
            System.out.println("参数:" + arg);
        }
    }
 }

由上可以看到,使用JoinPoint对象即可获取切点方法的参数值。

获取返回值的写法:

代码语言:javascript
复制
@Configuration
@Aspect
public class UserInfoAspect {

    @Pointcut("execution(* com.*.test(*))")
    public void test() {}
    
    //在事件通知类型中申明returning即可获取返回值
    @AfterReturning(value = "test()", returning="returnValue")
    public void logMethodCall(JoinPoint jp, Object returnValue) throws Throwable {

        System.out.println("进入后置增强了!");
        String name = jp.getSignature().getName();
        System.out.println(name);

        Object[] args = jp.getArgs();
        for (Object arg : args) {
            System.out.println("参数:" + arg);
        }

        System.out.println("方法返回值为:" + returnValue);

    }
}

由上可以看到,再申明事件通知的类型中申明"returing=returnValue",而后再切面的方法中引入 “Object returnValue”即可获取返回值。

如果你想同时拥有多个切入点的话,可以使用逻辑操作符 “&&”,“||”等,如下所示:

代码语言:javascript
复制
@Pointcut("execution(* com.*.(*))")
public void addUser() {}
   
@Pointcut("execution(* com.*.(*))")
public void updateUser() {}

@After(value = "addUser() || updateUser()", returning="returnValue")
public void pushAccountInfo(JoinPoint jp, Object returnValue){
    //这里写切面逻辑:
}

这里需要注意的是逻辑操作符的使用,容易让人混淆的是 “&&”与”||" 的区别,如果你想一个切面能同时对多个切入点生效,应该使用的是“||”,而不是“&&”。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java深度编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档