java 自定义注解+AOP实现日志记录

ssm版本:

1、首先自定义一个注解,该注解有两个属性,一个是模块名,一个是操作的内容。该注解是用来修饰Service层中的方法的。

2、创建一个切面类,该切面使用@Aspect和@Component注解修饰,该页面需要注入一个HttpSession对象。

注意:一个普通的java类是不能注入HttpSession对象的,因此需要在web.xml文件中配置

 org.springframework.web.util.IntrospectorCleanupListenerorg.springframework.web.context.request.RequestContextListener

3、在applicationContext.xml文件中配置aop:aspectj-autoproxy,扫描@Aspect注解。

springboot版本:

日志管理:
1、首先自定义一个注解,自定义的注解需要使用@Target(ElementType.METHOD),@Retention(RetentionPolicy.RUNTIME)修饰,然后给几个属性。
2、定义一个切面然后切面使用@Component,@Aspect修饰,然后定义扫描切入点表达式@After(“execution(* com.syzw.test…service…*(…))”),创建通知类型,通知类型里面可以使用 HttpServletRequest request=((ServletRequestAttributes)(RequestContextHolder.getRequestAttributes())).getRequest();去获取requet对象。
3、在该方法中就可以通过JoinPoint形参去获取实际操作对象的class类,然后就可以获取该到方法,然后可以获取到自定义的注解了就完成了日志的管理。

缺点:
如果需要进行比较信息的日志管理的话,需要在每一个操作dao接口的方法上添加自定义的注解,较为麻烦。
解决方式:
一般会在切面上判断url然后根据url去做相应的操作的,但是这种操作较不灵活。

JoinPoint是一个切入点,它封装了切入点和真实对象的一些信息。
JoinPoint常用的一些api:
getSignature():获取真实访问方法的全路径签名。
getArgs():获取传入目标方法的参数对象。
getTarget():获取被代理的对象。
getThis():获取代理对象。

Signature:
getName():获取操作的方法名。
getClass():获取方法所在的Class类。

注意:

其实每一个注解都对应了一个切面,注解只是其一个声明作用,并没有实际的意义。

使用Spring Aop自定义注解实现自动记录日志

(1)首先配置文件:

    <!-- 声明自动为spring容器中配置@aspectj切面的bean建立代理 ,织入切面 --><aop:aspectj-autoproxy /><!-- 开启注解扫描 --><context:component-scan base-package="com.ky.zhjd.**"/><!-- 为true说明代理基于类被建立(默认false,基于接口被建立) --><aop:config proxy-target-class="true"></aop:config>

(2)建立一个自定义注解类spring

注意建立时选Annotation,类名我叫ArchivesLog(日志档案的意思)。

ArchivesLog.java内容:

package com.ky.zhjd.common.log;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*** * 自定义注解类**/
@Target({ElementType.PARAMETER, ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface ArchivesLog {/** 要执行的操做类型好比:添加操做 **/  public String operationType() default "";  /** 要执行的操做名称好比:添加一条用户数据 **/  public String operationName() default ""; }

(3)新建一个切面类,我叫LogAspect.java

package com.ky.zhjd.common.log;import java.lang.reflect.Method;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** 切面类*/
@Aspect
@Component("logAspect")
public class LogAspect {private static final Logger log = LoggerFactory.getLogger(LogAspect.class);// 配置织入点@Pointcut("@annotation(ArchivesLog)")public void logPointCut() {}/*** 前置通知 用于拦截操做,在方法返回后执行* * @param joinPoint 切点*/@AfterReturning(pointcut = "logPointCut()")public void doBefore(JoinPoint joinPoint) {handleLog(joinPoint, null);}/*** 拦截异常操做,有异常时执行* * @param joinPoint* @param e*/@AfterThrowing(value = "logPointCut()", throwing = "e")public void doAfter(JoinPoint joinPoint, Exception e) {handleLog(joinPoint, e);}private void handleLog(JoinPoint joinPoint, Exception e) {try {// 得到注解ArchivesLog controllerLog = getAnnotationLog(joinPoint);System.out.println("---------------自定义注解:" + controllerLog);if (controllerLog == null) {return;}// 得到方法名称String className = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();String type = controllerLog.operationType();String name = controllerLog.operationName();// 打印日志  这里能够进行插入数据库操做log.info(">>>>>>>>>>>>>操做类型:", type);log.info(">>>>>>>>>>>>>操做名称:", name);log.info(">>>>>>>>>>>>>类名:", className);log.info(">>>>>>>>>>>>>方法名:", methodName);} catch (Exception exp) {// 记录本地异常日志log.error("==前置通知异常==");log.error("异常信息:", exp.getMessage());exp.printStackTrace();}}/*** 是否存在注解,若是存在就获取*/private static ArchivesLog getAnnotationLog(JoinPoint joinPoint) throws Exception {Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null) {// 拿到自定义注解中的信息return method.getAnnotation(ArchivesLog.class);}return null;}
}

(4)在方法上使用注解 , 而后调用该方法(这里在Controller层进行操作,也可以在Service层操作)

    @ArchivesLog(operationType="查询操做",operationName="查询一条用户详情")@RequestMapping(value = "/findByid", produces={"application/json;charset=UTF-8"})public @ResponseBody BaseResult<Object> findByid(String id) {String s="11";BaseResult<Object> r=userService.findById(s);System.out.println(r+">>>>>>>>>>");return r;}

ok 上效果:
在这里插入图片描述

有什么不完善的地方欢迎指出,一块儿学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

是人是谁_谁是白鹤滩最可爱的人

白鹤滩水电站是全球在建第一大水电站&#xff0c;主要特性指标均位居世界水电工程前列&#xff0c;2021年7月&#xff0c;首批机组投产发电将是白鹤滩工程为建党一百周年献礼的重大壮举。建设中的白鹤滩水电站工程建设不停步&#xff0c;白鹤滩水电站未来的运行管理者——白鹤滩…

使用@Order注解调整配置类加载顺序

Order 1、Spring 4.2 利用Order控制配置类的加载顺序&#xff0c; 2、Spring在加载Bean的时候&#xff0c;有用到order注解。 3、通过Order指定执行顺序&#xff0c;值越小&#xff0c;越先执行 4、Order注解常用于定义的AOP先于事物执行 1.Order的注解源码解读 注解类&am…

potplayer 多个进程_进程组、会话、控制终端概念,如何创建守护进程?

守护进程概念&#xff1a;守护进程&#xff0c;也就是通常所说的Daemon进程&#xff0c;是Linux中的后台服务进程。周期性的执行某种任务或等待处理某些发生的事件。Linux系统有很多守护进程&#xff0c;大多数服务都是用守护进程实现的。比如&#xff1a;像我们的tftp&#xf…

hadoop ubantu环境搭建_ubuntu hadoop学习 环境搭建

单机模式下载hadoop-2.7.3.tar.gz 并解压缩安装java环境sudo apt install openjdk-8-jdk设置环境变量vim /etc/profileexport JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64export CLASSPATH.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATHexport HADOOP_HOME/usr/local/hadoop…

详细介绍mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE

文章目录Normal 普通索引Unique 唯一索引Full Text 全文索引SPATIAL 空间索引btree索引和hash索引的区别在实际操作过程中&#xff0c;应该选取表中哪些字段作为索引&#xff1f;Normal 普通索引 表示普通索引&#xff0c;大多数情况下都可以使用 Unique 唯一索引 表示唯一的…

acs880 用户手册_华中数控、广州数控系统用户手册

数控加工仿真系统 广州数控系统用户手册上海宇龙软件工程有限公司2004 年 5 月华中数控、广州数控系统用户手册 目录I目录第一章 基本操作 ............................................................................................ 1 1.1 项目文件 ...................…

自学java去哪找工作比较好_如何自学java?什么程度可以找工作?

我个人学习Java就是自学的&#xff0c;所以还是有一些发言权&#xff0c;我是非计算机专业&#xff0c;上大三的时候想做程序员&#xff0c;因为感觉本专业不挣钱&#xff0c;用了一年的时间在学校自学了Java&#xff0c;学习的过程中无非就是两个字最重要&#xff1a;坚持。因…

mysql索引类型 normal, unique, full text

问题1&#xff1a;mysql索引类型normal&#xff0c;unique&#xff0c;full text的区别是什么&#xff1f; normal&#xff1a;表示普通索引 unique&#xff1a;表示唯一的&#xff0c;不允许重复的索引&#xff0c;如果该字段信息保证不会重复例如身份证号用作索引时&#x…

亚马逊出的平板电脑_美国最畅销的安卓平板电脑,还只有2GB内存

在美国除了iPad&#xff0c;谁家的平板电脑卖得最好&#xff1f;不是华为小米&#xff0c;也不是微软或谷歌&#xff0c;而是Amazon亚马逊。主打入门级定位的亚马逊Fire系列平板电脑&#xff0c;在北美的平板市场上&#xff0c;有着举足轻重的地位。今天&#xff0c;亚马逊正式…

MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别

MySQL普通索引与唯一索引 索引作用&#xff1a; 提高查询效率&#xff0c;一般加在经常查询或者排序的字段上。 普通索引&#xff1a; 允许字段值重复 唯一索引&#xff1a; 保证数据记录唯一性 如何选择&#xff1a; 查询过程&#xff1a; 对普通索引来说&#xff0c…

对接kafka_Kafka系列9:面试题是否有必要深入了解其背后的原理?我觉得应该刨根究底(上)...

​前言在本文开始之前&#xff0c;作者一直有个疑惑&#xff0c;就是面试题是只写写问题和答案就草草了事&#xff0c;还是应该深入分析一下其背后发生的一些原理。和朋友探讨以后作者还是决定采用后者的方式&#xff0c;因为我认为不仅要做到知其一&#xff0c;更要知其二&…

资源不足的情况怎么设置sparkrdd并行度_监控录像机资源不足或达到上限的原因及解决方法!...

在安装网络监控摄像机过程中&#xff0c;很多人遇到硬盘录像机画面上提升“资源不足”或性能“达到上限”的问题&#xff0c;新手遇到这样的问题会选择重启录像机&#xff0c;但是几次反复发现并不能解决。监控录像机资源不足或达到上限的原因及解决方法&#xff01;首先这种提…

python爬虫和八爪鱼哪个快_【后端开发】python爬虫和八爪鱼哪个快

八爪鱼有一些优势&#xff0c;比如学习成本低&#xff0c;可视化流程&#xff0c;快速搭建采集系统。能直接导出excel文件和导出到数据库中。降低采集成本&#xff0c;云采集提供10个节点&#xff0c;也能省事不少。八爪鱼采集器还提供了云采集服务&#xff0c;在很短的时间内就…

主动变被动9个例句_高中英语 :主动表被动的适用范围

1. 表衡量的动词。The room measures 5 by 6.2. sell, write, wash, read, wear, keep, drink等表状态的情况下。The pen writes well. The clothes wash well.3. 在动词不定式中主语发出的动作。I have a lot of work to do.4. 动词不定式前面的词为形容词时。The question …

node静态服务器优缺点_使用 Node.js 的优势和劣势都有哪些?

很多回答已经写的很全&#xff0c;补充(强调)一点——Node.js 中的容错性实在是很弱。当异步回调中出现异常&#xff0c;而相应的 error 的事件有没有被订阅(有时候根本不可能去订阅)&#xff0c;那么整个进程都会挂掉。但尴尬的是&#xff0c;这个问题处理起来还特别难&#x…

为什么要重写hashcode方法和equals方法

为什么要重写hashcode方法和equals方法 我们可能经常听到说重写equals方法必须重写hashcode方法&#xff0c;这是为什么呢&#xff1f;java中所有的类都是Object的子类&#xff0c;直接上object源码 /** Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights …

python代码_python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定!

你好由于你是游客无法查看本文请你登录再进谢谢合作当你在爬某些网站的时候需要你登录才可以获取数据咋整&#xff1f;莫慌小帅b把这几招传授给你让你以后从容应对那么接下来就是学习 python 的正确姿势登录的常见方法无非是这两种1、让你输入帐号和密码登录2、让你输入帐号密码…

利用电脑上自带指纹识别嵌入程序中_Win 10 隐藏功能:不用任何软件就可实现手机投屏到电脑...

投屏工具我也介绍了不少&#xff0c;所有的都是需要安装第三方软件的。不过&#xff0c;其实 Windows 10 就自带了手机投影到电脑的功能&#xff0c;不需要任何软件就能实现。在设置中打开系统&#xff0c;找到投影到此电脑&#xff0c;在红框中根据你的需要设置好&#xff0c;…

为什么要重写hashCode()方法和equals()方法以及如何进行重写

一、前言 本篇文章主要探讨的问题有三个&#xff1a; 1、首先我们为什么需要重写hashCode()方法和equals()方法&#xff1f; 2、在什么情况下需要重写hashCode()方法和equals()方法&#xff1f; 3、如何重写这两个方法&#xff1f; 二、为什么需要重写hashCode()方法和equal…

bloomberg用法 固定收益_内部收益率的用法浅谈某保险的真实收益率

公司财务课程&#xff0c;魏教授讲得非常棒&#xff0c;治愈了大家的瞌睡&#xff0c;激起了大家的学习热情。我一直认为&#xff0c;大牛在讲课&#xff0c;吹牛还是演讲中&#xff0c;都能够给现场观众提供强大的能量&#xff0c;使得彼此运行在同一个共振频率。内部收益率(I…