Springboot使用Aspect实现切面日志
前言
今天我们来说说spring中的切面Aspect,这是Spring的一大优势。面向切面编程往往让我们的开发更加低耦合,也大大减少了代码量,同时呢让我们更专注于业务模块的开发,把那些与业务无关的东西提取出去,便于后期的维护和迭代。
好了,废话少说!我们直接步入正题 以系统日志为例
首先,我们先做一些准备工作。
1、新建一个Springboot工程
2、添加必要的依赖
AOP 必须 org.springframework.boot spring-boot-starter-aop
gson主要是我用于数据的处理,不是必须的 com.google.code.gson gson 2.8.1
个人喜好 org.springframework.boot spring-boot-devtools runtime org.projectlombok lombok true
3、日志实体类和service package com.space.aspect.bo; import lombok.Data; /** * 系统日志bo * @author zhuzhe */ @Data public class SysLogBO { private String className; private String methodName; private String params; private Long exeuTime; private String remark; private String createDate; } package com.space.aspect.service; import com.space.aspect.bo.SysLogBO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * @author zhuzhe */ @Slf4j @Service public class SysLogService { public boolean save(SysLogBO sysLogBO){ // 这里就不做具体实现了 log.info(sysLogBO.getParams()); return true; } }
4、定义日志注解
这里呢,我们记录日志使用注解的形式。所以,先定义一个注解 package com.space.aspect.anno; import java.lang.annotation.*; /** * 定义系统日志注解 * @author zhuzhe */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysLog { String value() default ""; }
5、声明切面,完成日志记录
以上4点我们的准备工作已经完成。接下来就是重点了
这里需要你对AOP有一定的了解。起码知道切点表达式、环绕通知、前置通知、后置通知等… package com.space.aspect.aspect; import com.google.gson.Gson; import com.space.aspect.anno.SysLog; import com.space.aspect.bo.SysLogBO; import com.space.aspect.service.SysLogService; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 系统日志切面 * @author zhuzhe */ @Aspect // 使用@Aspect注解声明一个切面 @Component public class SysLogAspect { @Autowired private SysLogService sysLogService; /** * 这里我们使用注解的形式 * 当然,我们也可以通过切点表达式直接指定需要拦截的package,需要拦截的class 以及 method * 切点表达式: execution(...) */ @Pointcut("@annotation(com.space.aspect.anno.SysLog)") public void logPointCut() {} /** * 环绕通知 @Around , 当然也可以使用 @Before (前置通知) @After (后置通知) * @param point * @return * @throws Throwable */ @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { long beginTime = System.currentTimeMillis(); Object result = point.proceed(); long time = System.currentTimeMillis() - beginTime; try { saveLog(point, time); } catch (Exception e) { } return result; } /** * 保存日志 * @param joinPoint * @param time */ private void saveLog(ProceedingJoinPoint joinPoint, long time) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); SysLogBO sysLogBO = new SysLogBO(); sysLogBO.setExeuTime(time); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); sysLogBO.setCreateDate(dateFormat.format(new Date())); SysLog sysLog = method.getAnnotation(SysLog.class); if(sysLog != null){ //注解上的描述 sysLogBO.setRemark(sysLog.value()); } //请求的 类名、方法名 String className = joinPoint.getTarget().getClass().getName(); String methodName = signature.getName(); sysLogBO.setClassName(className); sysLogBO.setMethodName(methodName); //请求的参数 Object[] args = joinPoint.getArgs(); try{ List list = new ArrayList(); for (Object o : args) { list.add(new Gson().toJson(o)); } sysLogBO.setParams(list.toString()); }catch (Exception e){ } sysLogService.save(sysLogBO); } }
6、测试
接下来,我们就来测试一下吧 package com.space.aspect.controller; import com.space.aspect.anno.SysLog; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @author zhuzhe */ @RestController public class TestController { @SysLog("测试") @GetMapping("/test") public String test(@RequestParam("name") String name){ return name; } }
启动项目,访问我们的test方法。
我们在service里打一个断点
可以看到,我们所需要的值都成功拿到了。
这样,我们就成功实现了使用Aspect实现切面记录日志。
源码:https://github.com/zhuzhegithub/springboot-aop-aspect
哪个牌子的投影仪性价比高?雷数码精选投影仪品牌推荐手机和平板的出现降低了人们看电视机的频率,很多人在装修的时候都会选择安装当下最火的投影仪,在家就能享受影院级的效果,实现观影自由。因此,今年雷数码陆陆续续收到了很多关于投影仪的问题
华为智慧屏V75Super正式开售,你的一台电视何必是OLED北京时间8月12日,华为智慧屏V75Super正式开启首销,凭借HarmonyOS2的分布式能力趋于完备的生态,以及鸿鹄SuperMiniLED20单元帝瓦雷音响等属性,华为智慧屏
王思聪价值百万元的电脑,到底贵在哪?近日,娱乐圈纪检委王思聪又有了新的title专业搞机男。起因是因为博主电丸科技AK发布了一则视频,记录其受邀帮助王思聪组装电脑的经历。据悉,王思聪配置该电脑花费百万元,配置不输服务
五星级如厕感受,美标智能马桶盖评测来了说实话,我第一次接触智能马桶盖还是在某次入住五星酒店的时候,打那之后就感觉嗯,智能产品不愧智能,非常好用!不可否认,智能马桶盖水洗的方式真的很科学,比纸擦干净多了,也因此种了草,从
轻薄有型才貌双全!11代酷睿轻薄本就选惠普ENVY13从去年开始,轻薄本的处理器性能有了极大的飞跃。除了常规的办公学习娱乐之外,如果你需要运行一些对处理器性能要求较高的软件和应用比如PSPR等,选择搭载11代酷睿处理器的轻薄本就完全能
最值得买的华为手机,是你在使用的吗最值得买的华为手机,是你在使用的吗?第一款华为P40PRO1屏幕屏幕尺寸6。76英寸,屏幕色彩1670万色,分辨率FHD27721344像素,看电影更加舒畅。2相机后置摄像头超感知
ROG?什么牌子?游戏手机?来看看这是什么牌子我还真不晓得,不过看在它是游戏手机,我想到游戏党定会喜欢,我就去查了查。ROG游戏手机,是华硕发布的一款智能手机。ROGPhone5S的海外电商页面曝光,它搭载骁龙88
超高屏占比66W超级快充加持,荣耀X20亮点满满8月12日发布会主角毫无疑问是荣耀Magic3,其实有认真看发布会的朋友肯定知道,荣耀X20同样是一款十分值得推荐的机型,喜迎荣耀X系列再度更新,荣耀X20实际体验究竟如何?120
全芯升级,满血加持,T58V锐龙版评测在近两年的笔记本行业中,随着AMD处理器的7nm制造工艺愈发成熟,其推出的处理器不仅性能强劲,并且在发热量以及续航能力上均有非常不错的表现,成为了不少高性能笔记本的核心配置之一,而
广健产业体安软件终于在AppleStore上架啦经过日以继夜的翘首期盼我们的体安宝藏APP终于在苹果商城上架啦!体安一款支持安卓和iOS双端的智能健康管理软件结合体安健康手表及其他体安系列产品为用户提供心率血氧心电血压体温等健康
每周电视选购指南这几款又迎来史低价最近几月电视的价格始终居高不下,让不少有采购意向的小伙伴都开始持币观望,不过各大电商平台的优惠活动还是有的,只要细心,总会有捡漏的机会。本文就将本周来到史低价的电视产品进行汇总,手
中美技术实力人才培养对比及技术脱钩的现状与挑战自2017年底以来,美国对华政策发生重大转变,贸易摩擦和技术竞争逐渐成为两国关系的焦点。中国力争加强自主创新能力,掌握关键核心技术,做创新型大国。美国则以中方强制美企技术转让,盗窃
如何把银行卡的钱转到微信里?操作简单,老年朋友也可以一学就会现如今,使用微信进行支付的人越来越多,但在消费时,要使用微信零钱支付的话就必须保持微信零钱内有足够的余额,如果余额不足的话,就需要从银行卡上转钱到微信里,那怎么才能将银行卡上的钱转
4K居然比2K的显示效果更差?春节假期的时候用电视投屏看一些电影,发现用4k电视的显示效果还不如用2k的屏幕的效果好,难道是这台4k电视的显示技术不达标?查了很多资料,发现这不是4k屏幕的问题,而是像素点分散的
爬取数据须遵规数据爬虫技术作为一种重要的数据采集手段,被广泛应用于互联网的诸多领域,也引发了越来越多的争议,例如与其相关的互联网企业之间不正当竞争甚至刑事犯罪问题,已然成为数据产业发展中亟待解决
AI在农业上该如何发展?人工智能农业会怎样?筒单地回答吧我小时侯那年七八岁,我家自留地,和我四姨叔邻畔种地,同时都种的谷孑,人家的谷苗比我家的谷苗明显区别,人家谷苗黑绿翠,我家的谷苗黄没有长势,我回家问父亲,父亲说人家耕地比
私域流量对电商重要吗?这是一个非常好的问题,也是很多想进入电商领域的从业者,比较关心的问题,作为一名IT从业者,我来回答一下。首先,随着互联网增量时代逐渐结束,私域流量对于电商运营者来说会越来越重要,一
给那些还没升级15。4beta2系统的机油一些真实感受1关于卡120Hz刷新率,切换语言的方式是失效的,怎么换都没办法卡120,之前15。1。1能成功卡120,15。4要想卡120,还是得从原始的卡片这种方式来卡,不过这种方法很容易掉
互联网到底有没有前景?趋势一,政府推动落实互联网加为全国性,各地政府提出建设主方案,招标或者外包帮助企业做转型服务型企业,在今后长期互联网加实施过程中,政府扮演一个引领者与推动者角色,符合政策成绩高的企
美参议员质疑特斯拉自动驾驶系统安全性来源经济参考报王婧据路透社报道,两位美国参议员8日致信电动汽车厂商特斯拉的首席执行官埃隆马斯克,对该公司的自动驾驶系统Autopilot和完全自动驾驶系统(FSD)的安全性表示深切
门店管理怎么做,如何提高业绩?门店要提高业绩,总结起来就是10个字做事获小利,用人赚大钱!怎么理解这句话,先给大家讲个例子老王和老李都喜欢钓鱼,他们的垂钓技术都非常高超,但是老王喜欢教很多人钓鱼,把方法教给大家
MicroStrategy比特币投资损失近1。5亿美元又买660枚MicroStrategy比特币投资损失近1。5亿美元又买660枚财联社2月2日电,全球持有比特币最多的上市公司MicroStrategy周二盘后公布了第四季度财报,净亏损9000