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

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

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

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

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

1、引入springboot包。

    <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5..RELEASE</version>
</parent>
<!-- 日志 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

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 < obj.length; 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 < o.length; 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、测试

aop的使用的更多相关文章

  1. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  3. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  4. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  5. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  6. .Net中的AOP系列之构建一个汽车租赁应用

    返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...

  7. .NET里简易实现AOP

    .NET里简易实现AOP 前言 在MVC的过滤器章节中对于过滤器的使用就是AOP的一个实现了吧,时常在工作学习中遇到AOP对于它的运用可以说是很熟练了,就是没想过如果自己来实现的话是怎么实现的,性子比 ...

  8. 在.Net中实现自己的简易AOP

    RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...

  9. 使用Java原生代理实现AOP

    ### 本文由博主柒.原创,转载请注明出处 ### 完整源码下载地址 [https://github.com/MatrixSeven/JavaAOP](https://github.com/Matri ...

  10. 【开源】.Net Aop(静态织入)框架 BSF.Aop

    BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...

随机推荐

  1. PHP socket通信之UDP

    服务端: //服务器信息 $server = 'udp://127.0.0.1:9998'; //消息结束符号 $msg_eof = "\n"; $socket = stream_ ...

  2. 参考termux中包管理命令的伪装修改的arch版包管理命令

    #!/bin/bash set -e -u show_help() { echo "This help message is useless, please read the content ...

  3. 假如java类里的成员变量是自身的对象

    假如java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉似乎死循环了. 不过我想的肯定是错的,因为很多类的成员变量是自身对象,并且绝对无错,举个例子: Class A{ pr ...

  4. KL距离,Kullback-Leibler Divergence

    http://www.cnblogs.com/ywl925/p/3554502.html http://www.cnblogs.com/hxsyl/p/4910218.html http://blog ...

  5. SQL性能优化前期准备-清除缓存、开启IO统计

    文章来至:https://www.cnblogs.com/Ren_Lei/p/5669662.html 如果需要进行SQl Server下的SQL性能优化,需要准备以下内容: 一.SQL查询分析器设置 ...

  6. 大数据处理框架之Strom:Storm集群环境搭建

    搭建环境 Red Hat Enterprise Linux Server release 7.3 (Maipo)      zookeeper-3.4.11 jdk1.7.0_80      Pyth ...

  7. linux 系统监控和进程管理

    1.命令top,查看cpu和内存使用,主要进程列表和占用资源. 2.内存使用命令foree -g 3.查询所有java进程:pgrep -l java     ------ps aux|grep .j ...

  8. DB2的空间数据库管理复杂配置

    计算机条件: a机器:linux系统           安装arcgis server b机器:windows系统     安装catalog c机器:linux系统           安装DB2 ...

  9. 关于Ajax无法下载文件到浏览器本地的问题

    最近在做网站的时候遇到这样一个功能,在如图所示的页面中,需要用户点击链接的时候,能够以异步Ajax的方式判断服务器中是否存储有相应的Excel文件,如果没有的话就提示用户没有找到,如果有的话就下载到用 ...

  10. HDU 2176 取(m堆)石子游戏 (尼姆博奕)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎 ...