热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

aop的使用

最近考虑需要记录客户对项目的操作日志。如果在每一个客户都有可能操作的类增加日志对象,改动量太大,同时如果有新的功能增加,又要在新的功能上增

最近考虑需要记录客户对项目的操作日志。

如果在每一个客户都有可能操作的类增加日志对象,改动量太大,同时如果有新的功能增加,又要在新的功能上增加日志操作。

因此考虑后决定采用spring的aop功能。

spring的aop设置分为两种情况,一是通过xml配置,二是注解配置。

笔者使用的是springboot,直接省略掉了配置文件,因此采用的是注解配置的方式。

1、引入springboot包。

org.springframework.bootspring-boot-starter-parent1.5.9.RELEASEorg.springframework.bootspring-boot-starter-log4j2org.springframework.bootspring-boot-starter-aop

2、新建切面类。

新建一个类LogAspect,类上添加注解@Component,表示该类让spring自动扫描并装载。

再在类上添加注解@Aspect表示该类会作为一个切面,从而会被进行动态代理。

然后定义切点,切点可以用方法来表示,也可以用字符串来表示。

用方法表示:

  定义方法pointCut2(){},方法上添加注解@PointCut(value),表示该方法是一个切点,注解里的值表示切点表达式,第一个*表示任意的返回类型,然后是完整类名,第二个*表示是domain下的所有类,第三个*表示所有方法,括号中的两点表示任意参数。这一个切点表达式的完整意思是在包com.yxf.demo.springboot.domain下的所有类的所有方法。

@Pointcut("execution(* com.yxf.demo.springboot.domain.*.*(..))")public void pointCut2(){}

用字符串定义:

  只是将切点表达式创建为一个字符串。

String pointcut = "execution(* com.yxf.demo.springboot.domain.*.*(..))"

切点设置完成后,定义我们需要的通知类型。

spring aop分为五种通知类型:

  • @Before  前置通知
  • @After  后置通知(不论方法是否执行成功,即使抛出异常也会被通知)
  • @AfterReturing  返回通知(方法执行成功才会被通知)
  • @AfterThrowing  异常通知(方法执行抛出异常才会被通知)
  • @Around  环绕通知(方法执行前被通知,执行后也会被通知,同时返回参数会由通知类进行返回。)

一个完整的demo类如下:

package com.yxf.demo.springboot.config;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LogAspect {@Pointcut("execution(* com.yxf.demo.springboot.domain.*.*(..))")public void pointCut2(){}@Before("pointCut2()")public void before(JoinPoint join){System.out.println("***************************before***************************");Object[] obj = join.getArgs();if(obj != null && obj.length > 0) {for (int i = 0; i ) {System.out.println("before[" + i + "]:" + obj[i]);}}System.out.println("getKind:" + join.getKind());System.out.println("getTarget:" + join.getTarget().getClass());System.out.println("getThis:" + join.getThis().getClass());System.out.println("getSignature:" + join.getSignature());System.out.println("getSourceLocation:" + join.getSourceLocation().getClass());System.out.println("getStaticPart:" + join.getStaticPart());}@Around("pointCut2()")public Object Around2(ProceedingJoinPoint p) {Object[] o = p.getArgs();if(o != null && o.length > 0) {for (int i = 0; i ) {String s = (String) o[i];System.out.println("s[" + i + "]=" + s);}}
// System.out.println("i="+dwbm);System.out.println("***************************around***************************");Object obj = null;try {obj = p.proceed();System.out.println("result=" + obj.toString());} catch (Throwable e) {e.printStackTrace();}return obj;}}

3、测试

转:https://www.cnblogs.com/yxth/p/9447753.html



推荐阅读
  • Tornado框架中模块与静态文件的应用
    本文详细介绍了Tornado框架中模块和静态文件的使用方法。首先明确模块与模板的区别,然后通过具体的代码示例展示如何在HTML文档中使用模块,并配置模块的路由。最后,提供了模块类中参数获取的示例。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在 Java 中,`join()` 方法用于使当前线程暂停,直到指定的线程执行完毕后再继续执行。此外,`join(long millis)` 方法允许当前线程在指定的毫秒数后继续执行。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
author-avatar
年庚瑶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有