spring 切面编程中获取具体方法的方法

  工作中,使用环绕通知,用来捕获异常,然后通过获取方法的返回值,返回不同的数据给到调用方。

  由于方法的返回值不同,我们处理异常时,也需要返回不同的格式。

  这时,就需要获取具体方法了的返回值了。

  我的环绕通知方法如下:

@Around(value = "GlobalControllerAspect.controllerPointcut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object result = null;
try {
long statrTime=System.currentTimeMillis();
result = proceedingJoinPoint.proceed();
long endTime=System.currentTimeMillis();
String declaringTypeName = proceedingJoinPoint.getSignature().getDeclaringTypeName();
String methodName = proceedingJoinPoint.getSignature().getName();
StringBuilder spendTimeLog=new StringBuilder("方法名称:").append(declaringTypeName).append(".").append(methodName).append("() 耗时为:").append(endTime-statrTime).append("ms.");
logger.info(spendTimeLog.toString());
} catch (Exception e) {
logger.error("环绕通知捕获异常信息:",e);
ResponseModel responseModel=new ResponseModel();
if (e instanceof RuntimeException) {
responseModel.setStatus(ResponseModel.STATUS_FAIL);
responseModel.setMsgType(ResponseModel.MSGTYPE_INFO);
responseModel.setMsgContent(e.getMessage());
} else {
responseModel.setMsgType(ResponseModel.MSGTYPE_WARINNING);
responseModel.setStatus(ResponseModel.STATUS_ERROR);
responseModel.setMsgContent(e.getMessage());
}
Signature sig = proceedingJoinPoint.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Object target = proceedingJoinPoint.getTarget();
Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
Class<?> returnType = currentMethod.getReturnType();
if(returnType.isAssignableFrom(responseModel.getClass())||returnType==ResponseModel.class){ return responseModel;
}else if(returnType==JSONObject.class){
return responseModel.toJSON();
}
}
return result;
}

获取具体方法的代码:

Signature sig = proceedingJoinPoint.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Object target = proceedingJoinPoint.getTarget();
Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
Class<?> returnType = currentMethod.getReturnType();

获取到具体方法,返回值就很容易获取了。

spring aop 切面编程中获取具体方法的方法的更多相关文章

  1. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  2. Java编程中获取键盘输入实现方法及注意事项

    Java编程中获取键盘输入实现方法及注意事项 1. 键盘输入一个数组 package com.wen201807.sort; import java.util.Scanner; public clas ...

  3. Spring AOP 切面编程的方法

    spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring ...

  4. Spring AOP 切面编程实战Demo项目

    为什么会有此项目?在某日,我看博客时,看到了讲面向切面编程的内容,之前也知道spring是面向切面编程的,只是自己没有写过相关的代码,于是决定自己写一个test.但是url拦截器从外部看,和AOP有相 ...

  5. spring aop切面编程实现操作日志步骤

    1.在spring-mvc.xml配置文件中打开切面开关: <aop:aspectj-autoproxy proxy-target-class="true"/> 注意: ...

  6. spring aop 切面编程

    import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Ha ...

  7. 快速高效掌握企业级项目中的Spring面向切面编程应用,外带讲面试技巧

    Spring面向切面编程(AOP)是企业级应用的基石,可以这样说,如果大家要升级到高级程序员,这部分的知识必不可少. 这里我们将结合一些具体的案例来讲述这部分的知识,并且还将给出AOP部分的一些常见面 ...

  8. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  9. Spring 面向切面编程(AOP)

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

随机推荐

  1. windows安装composer

    Composer 是 PHP 的一个依赖管理工具(不是一个包管理器).它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 在windows下安装的方法 方法一:使用安装程序 这是将 Com ...

  2. 20175213《Java程序设计》实验二Java面向对象程序设计实验报告

    实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装,继承,多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 知识总结 1.伪代码 2.产品代码: ...

  3. 爬虫之Selenium 动态渲染页面爬取

    Selenim 是一个自动化测试工具,可以利用它驱动浏览器执行特定的动作,如点击.下拉等操作,同时可以获取浏览器当前呈现的页面的源代码,做到可见及可爬 1.使用流程 1)声明浏览器对象 Seleniu ...

  4. EXPRESS项目PM2启动NODE_ENV传参数不生效问题解决方法

    expree项目开发完,涉及到不同环境,要在启动到时候就要配置好环境变量, packge.json文件如下: "scripts": { "dev": " ...

  5. 【深入Java虚拟机(1)】:Java内存区域与内存溢出

    原文出处: 兰亭风雨 内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Jav ...

  6. Epson 微型打印机打印 LOGO C#

    由于项目需要使用EPSON微型打印机打印LOGO,在网上查看了很多都是安装驱动然后设置打印机图片. 项目需要使用Bytes发送流,最后在网上找到了一些资料,记录下来方便自己和其他人使用. public ...

  7. ajax请求aspx.cs后台方法

    前台jquery代码 $(function () { $("#btnfix").click(function () { $.ajax({ type: "post" ...

  8. 聚宽投资研究获取A股05年至今全部数据

    #用中正全指'000985.XSHG'获取全部A股数据pool=get_index_stocks('000985.XSHG') #date存储05年开始全部交易时间 date=get_price('0 ...

  9. Windows7下安装、部署Weblogic和发布war项目

    安装 1 从官方下载安装包 链接 2 下载之后,放到 Java8\jdk1.8.0\bin目录下 3 打开cmd,输入 java -jar . 4 5 6 下面是我自定义的目录, 7 8 9 10 1 ...

  10. 在windows下使用jenkins部署docker容器

    在windows下使用jenkins部署docker容器最近在学习jenkins,docker部署来实现集成部署,所以想在windows下面实现测试,但是发现在windows下docker支持不是很好 ...