SpringAOP Aspect注解实现简单日志功能

SpringAOP实现简单日志功能

AOP(Aspect Oriented Programming):面向切面编程,Spring框架的重要组成部分,利用AOP我们可以将一些公用的业务逻辑部分抽取出来,动态的插入到程序中(如日志记录、权限控制等),降低了各业务逻辑的耦合度。

关于AOP的相关概念这里就不进行讲解了,不了解的可以自行学习下,这里为了方便理解下面代码简单讲解几个概念:

  1. JointPoint(连接点):程序执行中的某个特定的点,例如controller中的访问方法、service中的业务方法等,可以简单理解为调用的方法。
  2. Pointcut(切入点):用来匹配连接点,执行特定的通知 (Advice) 。
  3. Advice(通知):可以简单理解为在before,after,afterReturning,afterThrowing,around中执行的代码。

在开始前首先我们需要在pom.xml中引入一些相关的jar。

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.7.4</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.7.4</version>
</dependency>
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.1</version>
</dependency>

进入代码环节,创建一个切面类LogAspect ,如下:

@Component
@Aspect
public class LogAspect {/*** 切入点,使用方法切点函数execution匹配* * com.xxx.aop.test..*.*(..):表示test包和所有子包里的任意类的任意方法*/@Pointcut("execution(* com.xxx.aop.test..*.*(..))")public void logPointcut(){}/*** 后置通知,JointPoint执行完成后执行,不论是否JointPoint异常,实质是finally中的代码块* @param joinPoint*/@After("logPointcut()")public void doAfter(JoinPoint joinPoint){Object[] args = joinPoint.getArgs(); // 参数值String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames(); // 参数名String methodName = joinPoint.getSignature().getName(); // 获取方法名HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String ip = request.getRemoteAddr(); // 获取IP地址HttpSession session = request.getSession();User user = (User)session.getAttribute("userCache");//获取用户,根据自身项目实际情况修改//保存日志System.out.println("执行保存日志操作...");}
}

@After注解的方法是在JointPoint执行完以后执行,如果需要在JointPoint执行前执行某些操作,可以使用@Around注解,使用方法如下:

	/*** 环绕通知,在JointPoint执行完成前后执行* @param pjp* @return* @throws Throwable*/@Around("logPointcut()")public Object doAround(ProceedingJoinPoint pjp) throws Throwable{//切入方法执行前的操作System.out.println("LogAop Before Advice...");//执行joinPointObject obj=pjp.proceed();//切入方法执行后的操作System.out.println("LogAop After Advice...");//必须返回执行结果,不返回会出现404等错误return obj;}

Spring和SpringMVC的配置文件中都进行如下配置:

<!-- 注意自己的配置中是否存在下面的配置,如果有就无需再配置 --><!-- xml命名空间的声明 -->
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=
"http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"
<!-- 开启aspectj注解 -->
<aop:aspectj-autoproxy />

SpringMVC是Spring的一个子容器,为了解决事务失效问题,我们通常会配置在Spring容器中不扫描@Controller注解,在SpringMvc容器中只扫描@Controller注解。因此,如果不需要切入Controller的话SpringMVC配置文件就不需要进行配置,反之,只切入Controller就不需要配置Spring配置文件。

到此为止,一个简单的日志切面就完成了,日志记录了用户、访问IP、访问方法等信息,但用户并不能通过查看日志中的访问方法知道是操作的哪个菜单,下篇文章讲解[SpringAOP+自定义注解实现日志功能]。

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

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

相关文章

chimerge算法matlab实现,有监督的卡方分箱算法

实现代码import numpy as npimport pandas as pdfrom collections import Counterdef chimerge(data, attr, label, max_intervals):distinct_vals sorted(set(data[attr])) # Sort the distinct valueslabels sorted(set(data[label])) # Get all possible labelsempty_coun…

金士顿u盘真假软件_简洁轻巧 金士顿DT80 Type-C高速闪存盘评测

从都市的高端会议到普通的日常娱乐&#xff0c;USB高速闪存应用于我们生产生活的方方面面。它小巧便携&#xff0c;稳定可靠的特点吸引了无数人去使用&#xff0c;同时为我们提供了诸多便利。闪存盘也就是日常生活中经常提到的U盘。大多数人对于U盘的印象是老式的USB Micro接口…

php阴影效果,如何使用css3实现文字的单阴影效果和多重阴影效果(

使用css3实现文本阴影效果的原理实现阴影效果主要是用text-shadow属性&#xff0c;根据W3C标准&#xff0c;如果我们想要在IE下兼容CSS3的阴影属性可以使用ie.css3-htc&#xff0c;不过按照标准InternetExplorer9以及更早版本的浏览器暂时不支持text-shadow属性。最基本的语法为…

SpringAOP+自定义注解实现日志功能

SpringAOP自定义注解实现日志功能 上篇文章讲解了springAOP实现简单日志功能&#xff0c;这次讲解使用自定义注解实现日志功能。具体pom、Spring、SpringMVC的配置不再进行讲解&#xff0c;详情点击链接查看[SpringAOP Aspect注解实现简单日志功能]。 如果你的项目使用的是sp…

promise链式调用_这一次,彻底弄懂 Promise

Promise 必须为以下三种状态之一&#xff1a;等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。一旦Promise 被 resolve 或 reject&#xff0c;不能再迁移至其他任何状态(即状态 immutable)。基本过程&#xff1a;初始化 Promise 状态(pending)执行 then(..) 注册回调处…

用MATLAB绘制国债NSS模型,[matlab]用lsqcurvefit或lsqnonlin实现NSS利率期限模型-经管之家官网!...

opt optimset(lsqcurvefit);opt.Display final;opt.MaxFunEvals20000;opt.MaxIter20000;opt.TolFun1e-140;opt.TolX1e-140;% x债券还有多久到期(年)&#xff1b;y对应债券到期收益率。% 所有数据均来自于上海证券交易所上市的国债。x [0.0274 0.0356 0.189 0.2 0.2411 0.380…

Spring 自定义注解,配置简单日志注解

java在jdk1.5中引入了注解&#xff0c;spring框架也正好把java注解发挥得淋漓尽致。 下面会讲解Spring中自定义注解的简单流程&#xff0c;其中会涉及到spring框架中的AOP&#xff08;面向切面编程&#xff09;相关概念。 不清楚java注解的&#xff0c;可以先了解java自定义注…

visual studio 判断dropdownlist选的是什么_心理测试:五个小蓝人,你选哪个?测你是不是一个容易追求的人...

下面这张图片里&#xff0c;有五个小蓝人&#xff0c;你觉得自己会是里面的哪一个&#xff1f;A. 站在家里的窗户边B. 站在河边C. 坐在屋顶D. 站在树上E. 骑着鸟飞在空中测试结果选A的你容易追求指数20%。你是一个温柔细腻的人。在别人的眼里&#xff0c;你是一个很贴心的人。在…

java中为何输出框会无限输出,MyBatis启动时控制台无限输出日志的原因及解决办法...

你是否遇到过下面的情况&#xff0c;控制台无限的输出下面的日志&#xff1a;Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImpl adapter.Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImpl adapter.Logging initiali…

基于注解SpringAOP,AfterReturning,Before,Around__springboot工程 @Around 简单的使用__SpringBoot:AOP 自定义注解实现日志管理

基于注解SpringAOP&#xff0c;AfterReturning&#xff0c;Before&#xff0c;Around AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff0c;即面向切面编程&#xff08;也叫面向方面编程&#xff0c;面向方法编程&#xff09;。其主要作用是&#xff0c;在不修…

流浪地球开机动画包zip_【文娱热点】流浪地球2定档2023大年初一;迪士尼计划裁员32000人...

剧集、综艺任嘉伦、白鹿《长安如故》开机11月26日&#xff0c;根据小说《一生一世美人骨》古代篇改编的剧集《长安如故》开机&#xff0c;两位主演任嘉伦和白鹿继现代篇《一生一世》之后再演古代篇&#xff0c;俩人穿着棉服、梳着古装发髻现身开机仪式&#xff0c;心情非常好。…

matlab读气象数据,中国气象数据网

“中国气象科学数据共享服务网”的气象卫星资料与国内其他气象卫星资料发布平台的最大不同之处&#xff0c;在于卫星数据资源内容不同且时间序列相当完整。而且&#xff0c;(1)数据获取更便捷。在线获取数据无需等待邮件通知&#xff0c;无数据下载量限制。共享卫星资源是公益性…

spring中自定义注解(annotation)与AOP中获取注解___使用aspectj的@Around注解实现用户操作和操作结果日志

spring中自定义注解(annotation)与AOP中获取注解 一、自定义注解(annotation) 自定义注解的作用&#xff1a;在反射中获取注解&#xff0c;以取得注解修饰的类、方法或属性的相关解释。 package me.lichunlong.spring.annotation;import java.lang.annotation.Documented; …

php获取40001,php - Discord API错误#40001未经授权 - SO中文参考 - www.soinside.com

我通过OAuth2 URL(https://discordapp.com/api/oauth2/authorize?client_id398437519408103444&permissions59392&scopebot)验证我的机器人我想在我的discord服务器上发送消息到频道码&#xff1a;$curl curl_init();curl_setopt($curl, CURLOPT_URL, https://discor…

python 编译器pyc_有没有办法知道哪个Python版本.pyc文件被编译?

Is there any way to know by which Python version the .pyc file was compiled? 解决方案 You can get the magic number of your Python as follows: $ python -V Python 2.6.2 # python >>> import imp >>> imp.get_magic().encode(hex) d1f20d0a To ge…

php可以支持代码重用技术的命令,Linux下的编程 PHP高级技巧全放送(一)

全球超过300万个互联网网站的管理员都在使用&#xff0c;使得它成为最为普及的端脚本语言之一。其特点是运行速度快、稳定可靠、跨平台&#xff0c;而且是开放源软件。 随你使用的水平不同&#xff0c;PHP可以很简单&#xff0c;也可以很复杂&#xff0c;可以只使用它发送表格元…

python处理word表格格式_python---word表格样式设置

1、word表格样式的设置from docx import * document Document() table document.add_table(3, 3, style"Medium Grid 1 Accent 1") heading_cells table.rows[0].cells heading_cells[0].text 第一列内容 heading_cells[1].text 第二列内容 heading_cells[2].te…

Spring AOP——Spring 中面向切面编程

前面两篇文章记录了 Spring IOC 的相关知识&#xff0c;本文记录 Spring 中的另一特性 AOP 相关知识。 部分参考资料&#xff1a; 《Spring实战&#xff08;第4版&#xff09;》 《轻量级 JavaEE 企业应用实战&#xff08;第四版&#xff09;》 Spring 官方文档 W3CSchool Spri…

python getchar,Linux C编程学习:getchar()和getch()

getchar函数名: getchar功 能: 从stdin流中读字符用 法: int getchar(void);注解&#xff1a;getchar有一个int型的返回值&#xff0c;当程序调用getchar时程序就等着用户按键&#xff0c;用户输入的字符被存放在键盘缓冲区中直到用户按回车为止(回车字符也放在缓冲区中)。当用…

python 折线图中文乱码_彻底解决 Python画图中文乱码问题--Pyplotz组件

1 源起 自从开始学习Python&#xff0c;就非常喜欢用来画图。一直没有需求画要中文显示信息的图&#xff0c;所以没有配置Python中文的环境。由于昨天就需要画几十个形式相同&#xff0c;只是数据不同的图&#xff0c;并且需要显示中文信息。如果用Excel画图会很浪费时间&#…