spring-boot使用AOP统一处理日志
作者:贺小五 发布时间:2023-06-09 05:12:35
标签:springboot,AOP,日志
AOP我想大家都很清楚,有时候我们需要处理一些请求日志,或者对某些方法进行一些监控,如果出现例外情况应该进行怎么样的处理,现在,我们从spring-boot中引入AOP.
[开发环境:jdk版本号为1.8,spring
boot的版本号为1.4.1]{style=”background-color:#FF0000”}
首先,我们先引入jar包,
POM文件添加如下内容:
<!--引用AOP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--引用GSON,用于打印-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.7</version>
</dependency>
引入jar包后,我们在boot的启动方法,增加两个简单的请求处理方法:
@SpringBootApplication(scanBasePackages = {"com"})
@RestController
public class DemoApplication{
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
//测试无参的get请求
@RequestMapping(value = "/testAspect",method = RequestMethod.GET)
public UserVo test(){
UserVo userVo = new UserVo();
userVo.setAge("23");
userVo.setName("贺小五");
userVo.setSex("男");
return userVo;
}
//测试有参的get请求,让aop打印参数内容
@RequestMapping(value = "/testAspectArgs",method = RequestMethod.GET)
public UserVo test(String name,String age,String sex){
UserVo userVo = new UserVo();
userVo.setName(name);
userVo.setAge(age);
userVo.setSex(sex);
return userVo;
}
增加了两个简单的处理请求方法后,我们来增加我们的aop
/**
* 项目名:SpringBootDemo
* 创建人:贺小五
* 创建时间:16/12/4 下午7:05
* 类名:AspectDemo
* 类描述:
*/
//申明是个切面
@Aspect
//申明是个spring管理的bean
@Component
@Order(1)
public class AspectDemo {
private Logger log = Logger.getLogger(getClass());
private Gson gson = new Gson();
//申明一个切点 里面是 execution表达式
@Pointcut("execution(public * com.example.DemoApplication.*(..))")
private void controllerAspect(){}
//请求method前打印内容
@Before(value = "controllerAspect()")
public void methodBefore(JoinPoint joinPoint){
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
//打印请求内容
log.info("===============请求内容===============");
log.info("请求地址:"+request.getRequestURL().toString());
log.info("请求方式:"+request.getMethod());
log.info("请求类方法:"+joinPoint.getSignature());
log.info("请求类方法参数:"+ Arrays.toString(joinPoint.getArgs()));
log.info("===============请求内容===============");
}
//在方法执行完结后打印返回内容
@AfterReturning(returning = "o",pointcut = "controllerAspect()")
public void methodAfterReturing(Object o ){
log.info("--------------返回内容----------------");
log.info("Response内容:"+gson.toJson(o));
log.info("--------------返回内容----------------");
}
两者配置好之后,接下来,我们请求,然后查看打印日志,首先,启动我们的容器,然后我们先请求有参的处理请求方法的,打印日志如下:
{width=”1232”
height=”132”}
可以发现,请求的url,method,以及args参数的值,还有类型,以及返回的内容都打印出来了,说明,这是AOP拦截成功了.
接下来,我们测试下请求无参的处理请求方法,打印日志如下:
{width=”1100”
height=”130”}
我们可以发现,这个方法,打印的方法参数是个空数组,是因为方法不需要参数传递.
来源:https://my.oschina.net/u/2278977/blog/799786


猜你喜欢
- 很多APP都有侧滑菜单的功能,部分APP左右都是侧滑菜单~SlidingMenu 这个开源项目可以很好帮助我们实现侧滑功能,如果对Slidi
- 最近在搭建springmvc的框架,遇到的这样的问题:在地址栏访问登陆界面访问不了,http://localhost/XXXX/WEB-IN
- 登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象。本例中如果有注释不详细的地方,详见其它博客。功能介绍:简单的登录注册系统,
- 看过阿里巴巴开发手册的同学应该都会对Integer临界值127有点印象。原文中写的是:【强制】所有整型包装类对象之间值的比较,全部使用 eq
- volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性。什么是线程的可见性:锁提供了两种主要特性:互斥(mutual exc
- 建造者模式针对的是复杂对象的构建,比如一个产品有多个部分构成,每个部分都可以单独进行生产,这时候就可以用建造者模式,由Builder构造产品
- mybatis获取表中某一列的最大值这个问题这两天也是找了好久才找到解决办法,在此记录一下。获取表中数据某一列的最大值,在mapper.xm
- 绘制圆形锯齿问题普通绘制圆形形状时可以看到图形边缘会有明显锯齿现象并不像真实圆形形状一样圆润边缘平滑。在glsl中这种情况是常见情况,这里是
- 解析和遍历一个HTML文档如何解析一个HTML文档:String html = "<html><head>
- C#文件的读和写提供了非常多的方法基本一两行就可以搞定“读和写”,在编程里还是比较重要的什么是读?你的程序去读你磁盘里的文件上面是写?你的程
- 背景为了了解Seata AT模式的原理,我通过源码解读的方式画出了Seata AT模式启动的图示:如果是基于Springboot项目的话,项
- 1. 添加程序集2. 引入命名空间using System.Management;3. 方法M
- 类加载是什么把磁盘中的java文件加载到内存中的过程叫做类加载当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把
- 1、spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name)2、在web.xm
- 1、CyclicBarrier:一个同步辅助类,用于协调多个子线程,让多个子线程在这个屏障前等待,直到所有子线程都到达了这个屏障时,再一起继
- jackson反序列化忽略字段JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有
- 本文实例讲述了C#中DataGridView常用操作。分享给大家供大家参考。具体如下:public void Binder1(){ Data
- 对于服务器端开发人员而言,调用第三方接口获取数据,将其“代理”转化并返给客户端几乎是家常便
- JFormDesigner概述jformdesigner是一款功能强大的Swing设计工具,这是全面的程序,可帮助您创建Swing GUI,
- 首先什么是注解?@Override就是注解,它的作用是:1、检查是否正确的重写了父类中的方法。 2、标明代码,这是一个重写的方法。1、体现在