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+自定义注解实现日志功能]。

SpringAOP Aspect注解实现简单日志功能相关推荐

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

    SpringAOP+自定义注解实现日志功能 上篇文章讲解了springAOP实现简单日志功能,这次讲解使用自定义注解实现日志功能.具体pom.Spring.SpringMVC的配置不再进行讲解,详情点 ...

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

    java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...

  3. java自定义注解实现日志功能

    一.spring aop的通知类型 1.前置通知(@Before):在连接点前执行,不会影响连接点的执行,除非抛异常: 2.后置通知(@AfterReturning):在连接点正常执行完成后执行,若连 ...

  4. 使用AOP与注解记录Java日志

    有些时候,我想要把每个运行过的方法接收到的参数.返回值和执行时间等信息记录(通过slf4j 和 log4j)下来.在AspectJ.jcabi-aspects和Java注解的帮助下我实现了这个想法. ...

  5. Spring AOP注解方式实现日志管理

    文章目录 自定义注解 BussLog BussLogAspect 前言:使用注解方式实现日志管理,可以使我们的程序变的清晰.简单,不和很多业务代码混在一起. 实现思路大致分为四点 设计日志表和日志类, ...

  6. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  7. @Aspect注解使用场景

    小刘的切面主要用于日志挡板. 1.首先 springboot中pom引入jar <dependency><groupId>org.springframework.boot< ...

  8. @Aspect注解用法

    本文继续AOP,目前手动Aop中三种方式已经介绍2种了,本文将介绍另外一种:AspectJProxyFactory,可能大家对这个比较陌生,但是@Aspect这个注解大家应该很熟悉吧,通过这个注解在s ...

  9. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

最新文章

  1. java for循环返回值_Java中的for循环——通过示例学习Java编程(9)
  2. C 线程中容易忽视的 restrict 修饰符修饰
  3. java enum(枚举)的使用
  4. Manjaro使用笔记-使用中国源的方法
  5. 从0实现三层神经网络
  6. Java面试题一:字符串的字符分类器
  7. BJFU-ACM 12月8日月赛官方题解
  8. IIS无法启动——郁闷的KB939373补丁
  9. IJCAI最佳论文公布 华人斩获最佳学生论文奖!
  10. 《把时间当作朋友》——运用心智获得解放 读书笔记(2)
  11. 私有云的优缺点_私有云服务器的优缺点
  12. 隔离DCDC电源模块和非隔离DCDC电源模块不同之处
  13. 赴日java常问问题_赴日软件工程师java笔试题
  14. 经营三类医疗器械不使用计算机,第三十条经营第三类医疗器械的企业,应当具有符合医疗器械经营质量管理要求的计算机信息管理系统,保证经营的产品可追溯。计算机信息管理系统应当具有以下功能:...
  15. 数据处理奇技巧——hive篇
  16. ecshop被加入了黑链
  17. spring获取配置文件的信息@Value @@ConfigurationProperties(prefix=“hel“)
  18. matlab7安装问题解决办法
  19. 改变自己—兄弟连IT教育
  20. Cocos图片加密与解密

热门文章

  1. [转载] Java ArrayList toArray(T[] a) 解惑
  2. 编程语言优缺点_R编程语言的优缺点
  3. Java Duration类| isZero()方法与示例
  4. java 根据类名示例化类_Java类类的requiredAssertionStatus()方法和示例
  5. php轻博客社区视频教程,轻博客主题 - SEO极致优化的ZBLOG轻博客主题
  6. 自定义动画属性java_创建酷炫动画效果的10个JavaScript库
  7. vue 导出_Vue核心知识:8.3 vuex在vue-cli中的应用,文件之间的导出与引入
  8. 服务器时间延迟,如何处理从服务器延迟响应时间'力逼近'
  9. java system.load()_System.load()与System.loadLibrary()
  10. c ++查找字符串_C ++类和对象| 查找输出程序| 套装1