AOP的具体实践-简化结果返回的处理
原因:
以前学习Spring的时候着重学习过AOP概念,但是一直也没有用上,唯一碰到过的就是Spring内置的事务管理。现在碰到过一些结果后面的操作适合用到,所以这里就拿出来用一下,并且复习一下落下的知识。
概念:
基本概念这个博主解释的比较清楚,如果有不懂的可以去看一下。https://blog.csdn.net/csh624366188/article/details/7651702
在我的认识里,如果某些方法重复性特别高,可以抽象出来形成一个切面,则可以使用AOP来简化代码,即在方法的某些部分动态的添加某些方法,起到简化代码的作用。
具体需求:
项目的Service层通过webService获取到数据,需要对获取到的数据进行判断处理,对其异常信息作出记录和抛出异常。同时还需要在进入和结束方法的时候进行日志记录。
知识点:
配置方法:
在这里使用的是注解的方式来配置的AOP,首先,要保证项目中除了Spring基本包以外还包含aopalliance-1.0.jar,aspectjrt-1.8.7.jar,aspectjweaver-1.8.7.jar,cglib-nodep-3.2.4.jar这四个jar包,这里将其打包放到百度云,如果有需要的可以去下载。链接:https://pan.baidu.com/s/1rDqLY1lnWdiahVkLcZd_bw 密码:0uea
Spring配置添加如下, 添加<aop:aspectj-autoproxy />需要添加Spring的头部内容
注意aop不能添加到static方法上面。
<aop:aspectj-autoproxy /> // 扫描AOP
<!-- 这里配置后就不用再使用bean标签配置bean了 -->
<context:annotation-config></context:annotation-config>
<!-- 去哪个包扫描生成bean -->
<context:component-scan base-package="com.dazhong.jnfy.alipay.action" />
首选建立切面类:其中的afterReturning就是主要的切面方法,用于对返回值进行判断并且进行对应的操作,这样可以不用再每个方法中都写一次。
@Pointcut("execution(* com.dazhong.jnfy.alipay.service.impl.*.*(..))"):表示AOP会代理那些方法,这里则表示com.dazhong.jnfy.alipay.service.impl包下面所有方法都会执行
@After("picter()"):后置通知
@Before("picter()"):前置通知
package com.dazhong.jnfy.alipay.aop; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.json.JSONObject;
import org.springframework.stereotype.Component; import com.dazhong.jnfy.alipay.exception.ConnectionException;
import com.dazhong.jnfy.alipay.exception.ResultErrorException;
import com.dazhong.utils.LogUtil; @Component
@Aspect
public class ServiceAop { @Pointcut("execution(* com.dazhong.jnfy.alipay.service.impl.*.*(..))")
public void picter() {
} /**
* @Description: 对返回值进行处理
* @param point
* @param rvt
* @throws ResultErrorException
*/
@AfterReturning(returning = "rvt", pointcut = "execution(* com.dazhong.jnfy.alipay.service.impl.*.*(..))")
public void afterReturning(JoinPoint point, Object rvt) throws Exception { // Object rvt则是方法返回值,这里变量名称要和注解retruning值相同
String[] strs = point.getSignature().getDeclaringTypeName().split("\\.");
String fullname = strs[strs.length - 1] + "." + point.getSignature().getName(); JSONObject root = (JSONObject) rvt; if (rvt == null) {
throw new ConnectionException("WebService连接失败" + fullname);
} else if (!root.has("resultCode") || !root.get("resultCode").toString().equals("0")) {
// 返回数据异常
throw new ResultErrorException("WebService 返回结果异常:" + root.toString());
}
} @Before("picter()")
public void before(JoinPoint point) {
String[] strs = point.getSignature().getDeclaringTypeName().split("\\.");
String fullname = strs[strs.length - 1] + "." + point.getSignature().getName();
LogUtil.info("进入方法:" + fullname);
} @After("picter()")
public void after(JoinPoint point) {
String[] strs = point.getSignature().getDeclaringTypeName().split("\\.");
String fullname = strs[strs.length - 1] + "." + point.getSignature().getName();
LogUtil.info("方法结束:" + fullname);
} }
获取参数/方法名:
如果需要获取目标方法的参数/名字,则需要在切面的方法中添加变量 JoinPoint point,通过这个对象来进行获取。
String allname = point.getSignature().getDeclaringTypeName(); // 获取整个路径 包名+类名
System.out.println(allname);
String[] split = allname.split("\\.");
System.out.println("目标方法:" + split[split.length - 1] + "." + point.getSignature().getName()); // point.getSignature().getName() 获取方法名
System.out.println("@Before:参数为:" + Arrays.toString(point.getArgs())); // 获取目标方法的参数 point.getArgs()
结果: 红框内容就是AOP自动添加的。

剩余代码:
目标方法:
public JSONObject test() throws Exception{
System.out.println("目标方法执行");
JSONObject js = new JSONObject();
js.put("resultCode", "-1");
return js;
}
测试方法:
public static void main(String[] args) {
ApplicationContext appCtx = new ClassPathXmlApplicationContext("applicationContext.xml");
ReserveServiceImpl b = (ReserveServiceImpl) appCtx.getBean("reserveServiceImpl");
JSONObject js = new JSONObject();
js.put("s", "111");
try {
//JSONObject allDept = b.getDocterByTimeAndDept("YYKS002", "20180711");
b.test();
} catch (Exception e) {
System.out.println(e);
}
}
AOP的具体实践-简化结果返回的处理的更多相关文章
- AOP的姿势之 简化 MemoryCache 使用方式
0. 前言 之前写了几篇文章介绍了一些AOP的知识, 但是还没有亮出来AOP的姿势, 也许姿势漂亮一点, 大家会对AOP有点兴趣 内容大致会分为如下几篇:(毕竟人懒,一下子写完太累了,没有动力) AO ...
- AOP的姿势之 简化混用 MemoryCache 和 DistributedCache 的方式
0. 前言 之前写了几篇文章介绍了一些AOP的知识, 但是还没有亮出来AOP的姿势, 也许姿势漂亮一点, 大家会对AOP有点兴趣 内容大致会分为如下几篇:(毕竟人懒,一下子写完太累了,没有动力) AO ...
- Unity应用架构设计(12)——AOP思想的实践
想象一下,当程序所有的业务逻辑都完成的时候,你可能还来不及喘口气,紧张的测试即将来临.你的Boss告诉你,虽然程序没问题,但某些方法为什么执行这么慢,性能堪忧.领会了Boss的意图之后,漫长的排查问题 ...
- C# 中使用面向切面编程(AOP)中实践代码整洁
1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则(在作者的前一本书<代码整洁之道>也是被大力阐释),而面向切面编程(Aop)作为面向对象 ...
- Spring Aop 修改目标方法参数和返回值
一.新建注解 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Document ...
- C# 中使用面向切面编程(AOP)中实践代码整洁(转)
出处:https://www.cnblogs.com/chenug/p/9848852.html 1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则( ...
- AOP打印请求日志,打印返回值
@Aspect // 申明是个spring管理的bean @Component @Slf4j public class LogAspectServiceApi { private JSONObject ...
- Spring 学习二-----AOP的原理与简单实践
一.Spring AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...
- ASP.NET Core WebApi返回结果统一包装实践
前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关 ...
随机推荐
- 用PDMReader工具生成数据库设计文档(转载)
来源:http://blog.csdn.net/xinglun88/article/details/19987719 第一步:下载并安装PDMReader,资源网站: http://www.pdmre ...
- win10 uwp 让焦点在点击在页面空白处时回到textbox中
在网上 有一个大神问我这样的问题:在做UWP的项目,怎么能让焦点在点击在页面空白处时回到textbox中? 虽然我的小伙伴认为他这是一个 xy 问题,但是我还是回答他这个问题. 首先需要知道什么是空白 ...
- vue常见知识点整理
什么是 mvvm? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑:View ...
- [javaSE] 数组(排序-选择排序)
两层嵌套循环,外层循环控制次数,内层循环进行比较 for(int x=0;x<arr.length;x++){ for(int y=0;y<arr.length;y++){ if(arr[ ...
- execution表达式
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?) 除了返回类型模式.方法名模式和参数模式外 ...
- XML序列化与REST WCF Data Contract匹配时遇到的2个问题
问题一: XML序列化与RESTful WCF Data Contract不能匹配,无法传递类的值. 现象: 给类加上[Serializable]Attribute,可以成功序列化,但是WCF Ser ...
- CentOS7系列--1.1CentOS7安装
CentOS7安装 1. 下载CentOS7 下载的网址为: http://isoredirect.centos.org/centos/7/isos/x86_64/ 2. CentOS7安装 2.1. ...
- 以local模式使用Xshell+Xmanager远程监控jvisualvm
使用jvisualvm的remote方式监控服务器端jvisualvm时,不是很方便,因此通过local方式,应该是正路. 一.服务器端(Linux,最小安装模式,没有图形界面) 1.安装xauth ...
- linux_kernel_uaf漏洞利用实战
前言 好像是国赛的一道题.一个 linux 的内核题目.漏洞比较简单,可以作为入门. 题目链接: 在这里 正文 题目给了3个文件 分配是 根文件系统 , 内核镜像, 启动脚本.解压运行 boot.sh ...
- Android如何使用WebView访问https的网站
Android中可以用WebView来访问http和https的网站,但是默认访问https网站时,假如证书不被Android承认,会出现空白页面,且不会有任何提示信息,这时我们必须加多一些配置. 此 ...