【java】通过spring通过AOP实现日志打印(二)
本人菜鸡一个,上一篇文章说了说自己对AOP的理解,并留下了一个用spring注解实现AOP的坑,本文就来填填这个坑
该系列暂时有两篇文章:
【java】java中的AOP思想(一):https://blog.csdn.net/lsr40/article/details/88642153
背景:
上一篇文章写了java中aop的思想,其实就是为了让某个方法运行的时候,(不用写多余的代码,就能)附带打印日志的功能,所以从另一种角度来说,这也是一种方法增强的效果,我们编写好了functionA方法,自动(增强)增加了该方法打印日志的功能。
当我们通过java编写web项目的时候,基本上都是用的spring的框架吧,所以本文来看看如何在spring通过注解的方式实现(AOP)方法增强。
正文:
1、我们要在什么时候增强方法(寻找切点)?
2、我们要增强方法的什么(增强advice)?
3、确认编写代码(切点+增强的代码=切面!)
4、简单的模型:
假设我们现在需要编写一个所有的controller都中的方法都增强的切面我们需要做的是?
代码实现:
@Aspect
@Component
public class LogAspect {public LogAspect() {}//定义切点:所有拥有@RestController该注解的类里的方法都会被增强@Pointcut("@within(org.springframework.web.bind.annotation.RestController)")public void logPointCut() {}/*** 使用Around来增强方法,记录系统日志** @param point* @return* @throws Throwable*/@Around("logPointCut()")public Object around(ProceedingJoinPoint point) throws Throwable {long beginTime = System.currentTimeMillis();//执行原有方法Object res = point.proceed();//执行时长(毫秒)long time = System.currentTimeMillis() - beginTime;//打印日志System.out.println("打印日志")return res;}}
5、在模型上增加一些功能:
1、比如增加一个logService,然后把相关的日志保存到数据库,以便后续的分析!
2、那既然有了logService,就需要logMapper来实现数据库交互
3、我们总不能实时的往数据库插入日志吧,这样不管用户在你的网页中做什么操作都会插数据,很大程度上会影响数据库的性能,因此我们需要一个list来存放日志,并且定时插入数据。
所以如图:
所以切面类基本代码和上面那段一样,只是新增了紫色的部分的代码,橙色框中的代码,我想作为一个java程序员,应该得会写的把,不就是Mybatis框架中往数据库中增加数据嘛,把list里的数据批量插入数据库,应该也没问题吧,因此这里就只剩下,中间的紫色的Service如何编写。
@Service
public class LogService {@Resourceprivate LogMapper logMapper;//构造一个定时器private ScheduledExecutorService executorService;//创建一个线程安全的list,来存放日志对象private List<ControllerLogVO> controllerLogVOList = Collections.synchronizedList(new ArrayList());//定时器中开启一个线程来运行代码class LogRunnable implements Runnable {@Overridepublic void run() {if (controllerLogVOList.size() != 0) {logMapper.saveConttollerLogList(controllerLogVOList);//保存完之后,清空listcontrollerLogVOList.clear();}}}//第一次调用保存日志的时候,构造定时器private void initScheduledExecutorService() {if (executorService == null) {executorService = Executors.newSingleThreadScheduledExecutor();executorService.scheduleAtFixedRate(new LogRunnable(),60000,60000,TimeUnit.MILLISECONDS);}}//提供给切面调用的保存数据的方法,将日志对象存到线程安全的list中,等待定时器调用logMapper批量存数据public void saveControllerLog(ControllerLogVO controllerLogVO) {initScheduledExecutorService();controllerLogVOList.add(controllerLogVO);}}
那大概就是这样了~
然后我贴出一些我在写这篇文章时候,找到的一些好东西~
1、如上代码中用到了scheduleAtFixedRate,关于scheduleAtFixedRate与scheduleWithFixedDelay区别:https://lzhw1985.iteye.com/blog/1990829(作者:lzhw1985)
2、如果需要彻底全面的了解AOP,推荐这位大神的Spring中的AOP系列https://my.oschina.net/itblog?tab=newest&catalogId=431633(作者:摆渡者)
3、@Pointcut的用法:https://blog.csdn.net/qq_15037231/article/details/78159456(转载:斜阳雨陌)
4、Spring AOP 中@Pointcut的用法:https://www.cnblogs.com/liaojie970/p/7883687.html(作者:山高我为峰)
5、配置了 Spring AOP 但会调用两次的问题解决方法:https://blog.csdn.net/deniro_li/article/details/76139738(作者:deniro_li)
首先得谢谢提供本文代码的同事,还有就是昨天我领导说让我别天天四处玩,要多看源码,我觉得他说的有道理,很多框架不要光会用,还是要多研究研究为什么会有这样的框架出现,为什么框架的代码是这样,还是要多学习呀!~
本人菜鸡一只,如果有哪里写得不对,或者误导了大家的,请批评指出,本人一定虚心接受,坚决改正!
【java】通过spring通过AOP实现日志打印(二)相关推荐
- aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析
java相关:springboot配置aop切面日志打印过程解析 发布于 2020-3-31| 复制链接 摘记: 这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码 ...
- Spring boot配置logback日志打印到指定路径文件
在实际项目开发中,一般都是使用log打印日志到指定路径,生成文件,而平时使用的System.out.pring()只能输出日志到控制台. 当我们把项目打成war包部署到服务器上,会有不用的用户使用我们 ...
- java使用jnative控制北洋牌标签打印机打印二维码
[img]http://dl.iteye.com/upload/attachment/0076/8465/9b0e8b8f-3e37-326c-b453-17961ce8807f.png[/img] ...
- spring boot 全局统一日志打印
欢迎关注本人公众号 概述 本文以使用spring boot或者springmvc为例. 微服务之间调用,或者controller接收请求时,为了方便排查问题,通常会将入参与出参(返回值)打印出来. 为 ...
- icop java,java基于spring注解AOP的异常处理的方法
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- java动态菜单显示实现,java – 为Spring MVC / AOP应用程序实现动态菜单
我希望为我的 Spring MVC应用程序实现动态可更改的菜单(无论何时添加带注释的方法或控制器). 我想要的是引入新的注释(@RequestMenuMapping),它将转到@Controller ...
- 【Spring】AOP实现日志记录
我的aop记录日志,可以记录:[ 操作类型.操作描述.参数.登录项目的用户ip] 当然记录什么靠你自己决定. 一.自定义一个注解 @Target({ElementType.METHOD,Element ...
- Spring Boot AOP 实现日志持久化
项目需要做日志管理,并持久化到数据库中 首先创建LogInterceptor,并在类的上方加上注解 1 @Aspect 2 @Component 3 public class LogIntercept ...
- java(spring boot2.x版本)实现二维码生成(可以插入中间log和底部文字)
1.创建一个spring boot项目(非必须): 项目结构: 2.导入maven依赖: <dependency><groupId>org.springframework.bo ...
最新文章
- shell5.0密钥_8.使用Xshell5密钥登录liunx
- MS UC 2013-0-虚拟机-标准化-部署-2-模板机-制作-2-设置-虚拟机
- 混合索引_数据库面试题:查询在什么情况下不?索引-数据库知识点
- python解初中题_用python解一道数独小题
- linux编译mmc驱动,Embeded linux之MMC驱动
- Laravel 清空配置缓存
- robotframework基础学习(8)
- 探索比特币源码1-运行 Bitcoin Core Node
- php scrscriptipt,XSS挑战之旅闯关笔记
- tomcat虚拟盘符映射
- Docker 集群环境实现的新方式
- 二进制拆弹实验详解_Population Count算法-求二进制数中1的个数
- Cordova+Vue快速搭建Hybrid App
- jsp三大指令(总结)
- 在网页博客文章中输入上下角标(指次幂、下角标)、分数及特殊字符
- Espresso指南一(Espresso下载、安装、设置、基础、速查表)
- unity之环状图片轮播
- 新手真无线蓝牙耳机怎么选?大神推荐高颜值时尚主流蓝牙耳机推荐
- 9个不错的PDF搜索引擎
- android 按钮 onClick 五种事件写法