spring boot aop

这里要做就是利用aop 来打印请求的日志,返回结果,简单的异常处理

一:使用@Aspect注解创建切面,类名是 RquestAspect

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.alibaba.fastjson.JSON;
/**
 * 对每个请求进行log打印
 * @author ningque
 *
 */
@Aspect
@Component
public class HttpAspect {

}

二:再RquestAspect中创建切入点

/**
* 扫描so.dian.device.controller 包下所有类,所有有注解@RequestMapping 的方法
*/
@Pointcut("execution(* com.zhangxs.device.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)")
public void log() {}

三:创建调用方法前的日志打印

@Before("log()")
public void doBefore(JoinPoint joinPoint){
beginTime=System.currentTimeMillis();
HttpServletRequest request=this.getHttpServletRequest();
url=request.getRequestURL().toString();
method=request.getMethod();
args=joinPoint.getArgs();
inputAgrs=new Object[args.length];
for(int i=0;i<args.length;i++) {
if(args[i] instanceof HttpServletRequest) {
//有部分请求参数中会有request,request不能转json 会抛出not in non blocking mode 异常
}else {
inputAgrs[i]=args[i];
}
}
logger.info("开始调用: url={},method={},args={}",url,method,JSON.toJSONString(inputAgrs));
}

四:创建调用方法后的日志打印

@After("log()")
public void doAfter() {
long endTime=System.currentTimeMillis();
logger.info("接口结束调用: url={},method={},调用耗时={}",url,method,endTime-beginTime);
}

五:创建返回结果的日志打印

 @Around("log()")
public Object doAround(ProceedingJoinPoint pjp) {
Object result=null;
try {
result=pjp.proceed();
} catch (Throwable e) {
requestErrLogger.error("接口结束调用: url={},method={},异常信息={}",url,method,e);
e.printStackTrace();
}
logger.info("reponse={}",result);
return result;
}

六:获取request请求

public HttpServletRequest getHttpServletRequest() {
ServletRequestAttributes sa= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  HttpServletRequest request =  sa.getRequest();
  return request;
}

控制台打印日志:

2017-11-01-18-10 [http-nio-9090-exec-1] [HttpAspect] [INFO] - 开始调用: url=http://localhost:8080/zhangxs/studentInfo,method=GET,args=[{“testUrl":";https://com.zhangxs.so/hello/p/010000000308208"},null]
2017-11-01-18-10 [http-nio-9090-exec-1] [HttpAspect] [INFO] - reponse={"success":false,"code":0,"msg":"查询信息失败"}
2017-11-01-18-10 [http-nio-9090-exec-1] [HttpAspect] [INFO] - 接口结束调用: url=http://localhost:8080/zhangxs/studentInfo,method=GET,调用耗时=27446
时间: 2024-10-09 06:32:37

spring boot aop的相关文章

Spring Boot AOP解析

Spring Boot AOP 面向切面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面. AOP(Aspect Oriented Program) 面向切面编程 在面向切面编程的思想里面,把功能分为核心业务功能和周边功能. 核心业务,比如登陆,增加数据,删除数据都叫核心业务 周边功能,比如性能统计,日志,事务管理等等 周边功能在 Spring Boot 的面向切面编程AOP思想里,即被定义为切面 在面向切

Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理

Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理 本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 spring Aop切面中的@Before @Around等执行顺序与请求参数统一解码 https://www.cnblogs.com/newAndHui/p/11771035.h

spring boot aop打印http请求回复日志包含请求体

一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

spring cloud zipkin sleuth与spring boot aop结合后,启动慢

问题描述: 引入了spring cloud的监控starter,间接引入jooq. 又引入了 spring-boot-starter-web,所以间接引入aop. 参考下面资料后:https://github.com/jOOQ/jOOQ/issues/5902 发现可以通过修改aop表达式解决. 于是修改aop表达式如下: 问题解决. 原文地址:https://www.cnblogs.com/grey-wolf/p/8296026.html

Spring Boot AOP Demo

什么是AOP? AOP面向切面,切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性. 实现策略JAVA SE动态代理 CGLib 相关注解 @Aspect(方面) @Pointcut(切入点) @Before(之前) @After(之后) pom.xml <!--引用AOP--> <dependency> <groupId>org.springframework.boot</gro

Spring Boot AOP 简易操作日志管理

AOP (Aspect Oriented Programming) 面向切面编程. 业务有核心业务和边缘业务. 比如用户管理,菜单管理,权限管理,这些都属于核心业务. 比如日志管理,操作记录管理,这些都是边缘业务,可以统一的提出来. 尝试使用SpringBoot +AOP 提出操作记录业务. github aop_demo package com.lick.aspect.lang.annotation; import com.lick.aspect.lang.enums.BusinessType

spring boot aop日志管理(MongoDB)

aop拦截的是controller层请求,正常的请求用@Before来拦截, 异常的请求用@AfterThrowing来拦截 1.引用aop jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.0.3.RELEASE</version>

spring boot aop 报错

1.控制台报错 Pointcut is not well-formed: expecting 'name pattern' at character position 33 execution(com.stu.controller.*.*(..)) 2.eclipse提示 Pointcut is malformed: Pointcut is not well-formed: expecting 'name pattern' at character position 33 execution(c

玩转spring boot——开篇

很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我个人认为是非常一般.如果单纯从技术来说,其实有工作3年的工作经验的人技术就已经很好了,后面工作时间是为了增加经验和对编程的理解.随着工作时间的增加,就会对一个技术有更深层次的理解,反而发现自己需要学更多的新.并觉得自己什么都不会.什么都不懂,还需要不停的学习和提高,并觉得时间更本不够用.自己唯一的收