热门标签 | 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



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
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社区 版权所有