spring aop记录操作日志和错误日志
AOP介绍
aop这个概念不陌生了,我们就结合下边这个图来简单的介绍一下aop中的几个概念。
AOP:Aspect-Oriented Programming的缩写
JoinPoint:要切入的点,例如我们图中的addUser方法就是一个JoinPoint。
Pointcut:定系统中符合条件的一组Joinpoint。
Aspect:就是我们的切面,例如我们的日志类,里边包含了记录操作日志,记录异常日志等,那么这个对象就是一个切面。
Advice:怎么切,是在业务逻辑执行前去执行还是之后执行等。
aop实现
说了这么多,我们就以上边的图和名词解释来结合代码来讲一下他们的含义和如何执行的。
环境
业务类
一个类实现了一个接口addUser
public interface UserManager {public void addUser(String username,String password);
}
public class UserManagerImpl implements UserManager {@Overridepublic void addUser(String username, String password) {int a = 1/0;System.out.println("addUser");}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
注意:这里的addUser就是我们的JoinPoint,也就是切点,我们要切进去的方法。
切面(Aspect)
/*** 定义aspect,将横切点模块化* * @author mengh* */public class SecurityHandler {/*** 操作日志* * @param joinPoint*/public void checkSecurity(JoinPoint joinPoint) {System.out.println(joinPoint.getTarget().getClass() + "类"+ joinPoint.getSignature().getName());}/*** 异常日志* * @param joinPoint*/public void doThrowing(JoinPoint jp, Throwable ex) {System.out.println(jp.getTarget().getClass() + "类的方法的" + jp.getSignature().getName() + "可以记录程序运行时候抛出的异常信息: " + ex.getMessage());}}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
注意:这里的SecurityHandler 就是我们的切面,里边包含了我们要切入的操作。
方法的参数中JoinPoint 包含了我们切入方法的各个属性,包括类,方法名,字段名等等的信息。
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"><!-- 启用acpect对注解的支持 --><!-- <aop:aspectj-autoproxy></aop:aspectj-autoproxy> --><bean id="userManager" class="com.tgb.spring.UserManagerImpl" /><bean id="securityHandler" class="com.tgb.spring.SecurityHandler" /><aop:config><aop:aspect id="securityAspect" ref="securityHandler"><!-- <aop:pointcut id="addAddMethod" expression="execution(* add*(..))"/> --><!-- 操作日志的处理 --><aop:pointcut id="addAddMethod" expression="execution(* com.tgb.spring.*.add*(..)) ||execution(* com.tgb.spring.*.del*(..))"/><aop:before method="checkSecurity" pointcut-ref="addAddMethod"/><aop:after method="checkSecurity" pointcut-ref="addAddMethod"/><!-- 异常日志的处理 --><!-- <aop:pointcut id="addExceptionMethod" expression="execution(* com.tgb.spring.*.*(..)) || args(name)"/> --> <aop:after-throwing method="doThrowing" pointcut="execution(* com.tgb.spring.*.add*(..))" throwing="ex"/> </aop:aspect></aop:config>
</beans>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
注意:代码中aop:before等就是我们说的advice,大家按照字面的意思,就是告诉spring我要怎么切,是在方法执行之前就执行还是之后等等。
aop:pointcut就是告诉spring我们要切入的规则,例如这里边就是所有添加的方法都要执行操作日志的。
method:就是对应我们的切面类的方法名称。
客户端
public static void main(String[] args) {BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml");UserManager userManager = (UserManager)beanFactory.getBean("userManager");userManager.addUser("zhangssan", "wangwu");}
- 1
- 2
- 3
- 4
- 5
- 6
结果
红框是我们的操作类,告诉在什么时候操作了什么类的什么方法,个人感觉这个类中实际意就是测试性能的时候大一些,但是我们蓝框中的错误处理,这样我们的程序出错了,我们也能很清晰的找到我们的程序是哪里出错了,加上时间的话,就能找到出错的时间。
但是如果我们不用呢,是不是我们的程序如果需要加一个日志的方法,就要在所有的类里边,加上错误处理,加上操作日志,这样的话,如果我们要删除这个操作日志,觉得没什么用,那么我们就要一点一点的的去删除了。
spring aop记录操作日志和错误日志相关推荐
- Spring aop 记录操作日志 Aspect 自定义注解
时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题 所需jar包 :spring4.3相关联以及a ...
- SpringBoot AOP 记录操作日志、异常日志
使用SpringBoot AOP 记录操作日志.异常日志 我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能.在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因 ...
- 利用spring aop统一处理异常和打日志
利用spring aop统一处理异常和打日志 spring aop的概念,很早就写博客介绍了,现在在工作中真正使用. 我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger. ...
- mysql- 数据库的6种日志:错误日志、通用日志、慢日志、二进制日志、redo log、undo log
MySQL日志 日志用来做什么? 1.用来排错 2.用来做数据分析 3.了解程序的运行情况,是否健康 日志放在哪里? 日志一般放在数据目录 日志分类 错误日志.通用日志.慢日志.二进制日志 一.错误日 ...
- NGINX访问日志和错误日志
Logs are very useful to monitor activities of any application apart from providing you with valuable ...
- 日志php-error错误日志查看
转载: https://blog.csdn.net/ty_hf/article/details/55505262 前言: 对于我们做php开发的人员,上了生产环境,一定要把相关debug,displa ...
- 日志-php-error错误日志查看
前言: 对于我们做php开发的人员,上了生产环境,一定要把相关debug,display_errors错误提示等关掉.谁还难免不犯个错呢?这样能防止非致命性报错下,导致项目路径.数据库等信息泄漏. 问 ...
- logback日志配置(控制台日志、输出日志、错误日志)
logback日志配置(控制台日志.输出日志.错误日志) 一.logback.xml相关配置: <?xml version="1.0" encoding="UTF- ...
- 如何使用SpringBoot AOP 记录操作日志、异常日志?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...
- php 错误记录_PHP中把错误日志保存在系统日志中(Windows系统)
[将错误记录到系统日志中] 在 php.ini 中将 error_log 设置为: error_log = syslog 或者在运行时使用 ini_set() 函数设置. [例1] //关闭错误显示 ...
最新文章
- JVM---垃圾回收算法详解
- linux项目课程设计,LINUX课程设计项目需求解析.doc
- oracle12c无法访问em精简版,Oracle12C的EM无法访问怎么办?
- linux usb组合设备,USB组合设备(5)
- 换掉flash,flex,用FlashDevelop
- html登录注册的正则,怎么用html5编写用户注册验证程序
- mongodb 字段出现次数_MongoDB数据库
- 炒股十余年,亏了很多钱,现在很迷茫是退出股市还是继续坚持?
- 消息生产与消息存储——kafka源码探究之三
- python控制苹果手机触摸屏失灵怎么办_iPhone6触屏失灵,用一会就失灵,很恼火?...
- tolua错误大全-Chinar出品-几乎可为新手解决所有报错情景
- 【SharePoint】你无权在SharePoint designer中打开此网站
- 离散数学---序偶,笛卡尔积,自反,闭包
- 首次全面深度解密华为方舟编译器
- element ui Descriptions 组件无法显示样式 未渲染
- VBA编程实例----绘制李萨茹图形
- Git - 时光机穿梭
- 洛谷 P1348 Couple number
- 基于spss的多元线性回归(逐步回归法 stepwise regression)
- 温故知新(五)——三参数陷波滤波器离散化推导及MATLAB实现
热门文章
- plc是微型计算机,PLC控制系统与微型计算机系统的区别
- 美团Android开发工程师岗位职能要求,薪资翻倍
- 迪杰斯特拉算法(求最短路径)
- 实践:加快gradle的构建速度
- uniapp得到用户当前定位以及用户选择位置
- 十道解分式方程及答案_100道八年级解分式方程练习题(带答案)
- 【刘一哥2021总结】不负韶华,收获丰硕;不忘使命,砥砺前行
- 生活是艰难的,我又划着我的断桨出发了
- 重标极差分析法matlab,重标极差(RS)分析法估计Hurst指数的有效性检验.doc
- css扁平化设计,从一个web前端开发者的角度来看扁平化设计的5大优点