化繁就简,如何利用Spring AOP快速实现系统日志
1、引言
有关Spring AOP的概念就不细讲了,网上这样的文章一大堆,要讲我也不会比别人讲得更好,所以就不啰嗦了。
为什么要用Spring AOP呢?少写代码、专注自身业务逻辑实现(关注本身的业务而不去想其它事情,如安全、事务、日志等),用点上档次的话说:通过非侵入式的方式实现我们要实现的功能。
我们为什么要用Spring AOP来实现系统日志呢?系统日志的特点是在系统的多个模块中都要用到,为了实现日志的统一管理,我们一般有以下三种做法:
- 定义日志实现类,在需要记录日志的地方创建实例来进行调用;
- 定义一个日志接口及实现类,要用到日志的地方继承该接口(为什么是要定义接口,而不是直接定义类,是因为接口能够实现多继承,而我们的后台类中有不少本身就是要继承相应的接口的,这样不会因为日志接口的引入而影响我们其他的业务实现);
- 引入Spring AOP,面向切面编程,非侵入式的实现日志功能。
分析以上三种方式,都可以实现系统日志功能:
- 但第1种太繁琐了,搞得到处都是,不好看啊,也显得low;
- 第2种虽然不像第1种一样,但要记录日志就非得继承接口,还得进行一系列的调用方法、传递参数,总觉得额外增加了好多的累赘;
- 第3种,还不赖,只需在要记录日志的方法上添加一个注解就行了,能够记录的动态日志内容(区别于网上好多文章介绍的内容,记录的都是静态内容,简单是简单,了,但不实用啊)可以相当丰富,代码好干净,看着就爽。
2、Spring AOP实现系统日志要几步?
把大象装冰箱要几步?第一步打开冰箱,第二步把大象装进去,第三步关上冰箱门,齐活。
同样,Spring AOP实现系统日志要几步呢?
第一步自定义注解类;
第二步定义切面类;
第三步在普通类中的方法上加入自定义日志注解,齐活。
下面一张图说明:

理解了上面的图,您就已经可以利用Spring AOP来实现您自己的系统日志了。
系统日志一般保存在数据库里面,以方便管理人员的浏览查询。另外我们需要做到不同的操作类型要记录不同的内容,如增加或删除了数据,那么要记录增加或删除的详细信息,如果做了修改,日志要能记录修改前后的值,等等,这些工作都在第二步定义切面类中实现。
有关详尽的代码,大家可以参考视频:https://edu.51cto.com/sd/091c7 ,这里就不详细贴出来了
3、Spring AOP必要知识点
虽然说我不想讲解Spring AOP的概念,但必要的概念大家还是要清楚的,否则就会云山雾罩,照猫画虎可能画的都会不像。
对于下面Spring AOP的概念,我尽量讲人话:
连接点(JoinPoint):方法的前面、后面以及异常都是连接点,应用时的类为ProceedingJoinPoint;
切入点(Pointcut):就是在方法前面、还是后面或者是前后都织入,对应注解:@Before、@After、@Around;
织入(weaving):就是在方法前面、还是后面或者是前后都织入;对应注解:@Retention,包括三种类型,SOURCE、CLASS、RUNTIME、指明注解的生命周期,一般采用RUNTIME(运行时注解);
目标(target):向方法上添加新方法属性,对应注解:@Target;
切面(aspect):具体干活的类,对应注解:@Aspect;
另外还有代理(proxy)、通知(Advice)、引入(introduction)这三个概念,也就是三个概念,便于你更好的理解AOP机制。(不太恰当,好比面向对象编程,就要理解封装、继承和多态一样),理解最好,不理解也不会太影响您工作的开展。
化繁就简,如何利用Spring AOP快速实现系统日志的更多相关文章
- 利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)
主题:这份代码是开发中常见的代码,查询数据库某个主表的数据,为了提高性能,做一次缓存,每次调用时先拿缓存数据,有则直接返回,没有才向数据库查数据,降低数据库压力. public Merchant lo ...
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- (转)利用Spring AOP自定义注解解决日志和签名校验
一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...
- 利用Spring AOP和自定义注解实现日志功能
Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...
- 利用Spring AOP切面对用户访问进行监控
开发系统时往往需要考虑记录用户访问系统查询了那些数据.进行了什么操作,尤其是访问重要的数据和执行重要的操作的时候将数记录下来尤显的有意义.有了这些用户行为数据,事后可以以用户为条件对用户在系统的访问和 ...
- 利用spring AOP 实现统一校验
开发环境 JDK: 1.7 spring: 4.0.6 aspect: 1.7.4 应用背景 在APP与后台通讯的过程中,我们一般都会有个authToken的字符串校验,判断那些请求是需要校验用户 ...
- 利用Spring AOP机制拦截方法一例
直接上代码: @Aspect // for aop @Component // for auto scan @Order(0) // execute before @Transactional pub ...
- 利用spring AOP实现每个请求的日志输出
前提条件: 除了spring相关jar包外,还需要引入aspectj包. <dependency> <groupId>org.aspectj</groupId> & ...
- [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理
设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...
随机推荐
- Java实现蓝桥杯算法提高 陶陶摘苹果
试题 算法提高 陶陶摘苹果 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出n个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30 ...
- Java实现 LeetCode 312 戳气球
312. 戳气球 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left ...
- Java实现 LeetCode 190 颠倒二进制位
190. 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位. 示例 1: 输入: 00000010100101000001111010011100 输出: 0011100101111000001 ...
- java实现扑克牌移动
/* 下面代码模拟了一套扑克牌(初始排序 A~K,共 13 张)的操作过程. 操作过程是: 手里拿着这套扑克牌,从前面拿一张放在后面,再从前面拿一张放桌子上,再从前面拿一张放在后面,.... 如此循环 ...
- Java实现 蓝桥杯 历届试题 九宫重排
问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- java实现第四届蓝桥杯连续奇数和
连续奇数和 题目描述 小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和. 比如: 2^3 = 8 = 3 + 5 3^3 = 27 = 7 + 9 + 11 4^3 = 64 = 1 + ...
- java实现第五届蓝桥杯等额本金
等额本金 题目描述 小明从银行贷款3万元.约定分24个月,以等额本金方式还款. 这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息. 假设月利率是 ...
- 3.keras-简单实现Mnist数据集分类
keras-简单实现Mnist数据集分类 1.载入数据以及预处理 import numpy as np from keras.datasets import mnist from keras.util ...
- 详解 Flink DataStream中min(),minBy(),max(),max()之间的区别
解释 官方文档中: The difference between min and minBy is that min returns the minimum value, whereas minBy ...
- Lavarel 执行:php artisan migrate时报错
错误如下: 执行:php artisan migrate时报错: [PDOException]SQLSTATE[HY000] [2002] Connection refused 解决办法: 第一步:. ...