本人菜鸡一个,上一篇文章说了说自己对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实现日志打印(二)相关推荐

  1. aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析

    java相关:springboot配置aop切面日志打印过程解析 发布于 2020-3-31| 复制链接 摘记: 这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码 ...

  2. Spring boot配置logback日志打印到指定路径文件

    在实际项目开发中,一般都是使用log打印日志到指定路径,生成文件,而平时使用的System.out.pring()只能输出日志到控制台. 当我们把项目打成war包部署到服务器上,会有不用的用户使用我们 ...

  3. java使用jnative控制北洋牌标签打印机打印二维码

    [img]http://dl.iteye.com/upload/attachment/0076/8465/9b0e8b8f-3e37-326c-b453-17961ce8807f.png[/img] ...

  4. spring boot 全局统一日志打印

    欢迎关注本人公众号 概述 本文以使用spring boot或者springmvc为例. 微服务之间调用,或者controller接收请求时,为了方便排查问题,通常会将入参与出参(返回值)打印出来. 为 ...

  5. icop java,java基于spring注解AOP的异常处理的方法

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  6. java动态菜单显示实现,java – 为Spring MVC / AOP应用程序实现动态菜单

    我希望为我的 Spring MVC应用程序实现动态可更改的菜单(无论何时添加带注释的方法或控制器). 我想要的是引入新的注释(@RequestMenuMapping),它将转到@Controller ...

  7. 【Spring】AOP实现日志记录

    我的aop记录日志,可以记录:[ 操作类型.操作描述.参数.登录项目的用户ip] 当然记录什么靠你自己决定. 一.自定义一个注解 @Target({ElementType.METHOD,Element ...

  8. Spring Boot AOP 实现日志持久化

    项目需要做日志管理,并持久化到数据库中 首先创建LogInterceptor,并在类的上方加上注解 1 @Aspect 2 @Component 3 public class LogIntercept ...

  9. java(spring boot2.x版本)实现二维码生成(可以插入中间log和底部文字)

    1.创建一个spring boot项目(非必须): 项目结构: 2.导入maven依赖: <dependency><groupId>org.springframework.bo ...

最新文章

  1. shell5.0密钥_8.使用Xshell5密钥登录liunx
  2. MS UC 2013-0-虚拟机-标准化-部署-2-模板机-制作-2-设置-虚拟机
  3. 混合索引_数据库面试题:查询在什么情况下不?索引-数据库知识点
  4. python解初中题_用python解一道数独小题
  5. linux编译mmc驱动,Embeded linux之MMC驱动
  6. Laravel 清空配置缓存
  7. robotframework基础学习(8)
  8. 探索比特币源码1-运行 Bitcoin Core Node
  9. php scrscriptipt,XSS挑战之旅闯关笔记
  10. tomcat虚拟盘符映射
  11. Docker 集群环境实现的新方式
  12. 二进制拆弹实验详解_Population Count算法-求二进制数中1的个数
  13. Cordova+Vue快速搭建Hybrid App
  14. jsp三大指令(总结)
  15. 在网页博客文章中输入上下角标(指次幂、下角标)、分数及特殊字符
  16. Espresso指南一(Espresso下载、安装、设置、基础、速查表)
  17. unity之环状图片轮播
  18. 新手真无线蓝牙耳机怎么选?大神推荐高颜值时尚主流蓝牙耳机推荐
  19. 9个不错的PDF搜索引擎
  20. android 按钮 onClick 五种事件写法

热门文章

  1. linux mktemp 不可重入 问题
  2. Django生产环境部署—Ubuntu20.04 server安装(一)
  3. linux 服务器缓存清理
  4. 发点实用的快捷键(mac
  5. Spring——入门介绍(以版本5.2为例)
  6. 为,早日退休,过上无忧无虑的生活,而奋斗终生
  7. 实战某小型企业项目系列二:方案设计
  8. FreePBX 12 SIP协议30分钟自动挂断问题处理
  9. 2010年度中国十大杰出IT博客 评审
  10. 如何判断input复选框是否选中