本人菜鸡一个,上一篇文章说了说自己对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. Spring 数据源配置与应用
  2. python 语言-Python的语言特点
  3. 步骤详解安装Apache web服务器
  4. 大白话系列之C#委托与事件讲解(二)
  5. 【数学基础】运筹学:拉格朗日乘子法和KKT条件(上)
  6. 将自己的类封装为lib的方法
  7. 拦截器 过滤器 监听器 的区别
  8. zip2john工具爆破zip文件
  9. mitmproxy https抓包的原理是什么?
  10. [Vue.js]实战 -- 电商项目(四)
  11. MyBatis学习总结(13)——Mybatis查询之resultMap和resultType区别
  12. Python:if语句
  13. swing获取文本框内容_Swing 使用 JTable详解
  14. python和java选择哪个-Python与Java-你首选哪个?
  15. 无线路由器建立usb共享打印服务器,无线路由器USB网络共享管理设置方法
  16. 小马激活工具对比暴风激活工具
  17. 中国企业学习管理系统(LMS)市场趋势报告、技术动态创新及市场预测
  18. SwiftUI 人工智能教程之图像识别植物或花朵通过图片和相机
  19. 力扣(LeetCode)236. 二叉树的最近公共祖先(C语言)
  20. 光流传感器进行累积测试

热门文章

  1. cf723 Round #375 Div2-D【Floodfill+搜索】
  2. C#盯盘小工具,“监”
  3. 转:给在读研究生的一封信
  4. java计算机毕业设计课堂互动应答系统mp4源码+mysql数据库+系统+lw文档+部署
  5. SpringBoot+vue项目初级(一)
  6. linux用date获取时间戳格式说明
  7. 暖男须知,你应该转给他看看了
  8. AIoT深入智慧城市 应用场景遍地开花
  9. 2023 华为 Datacom-HCIE 真题题库 01/12--含解析
  10. JS面向对象思想(OOP)