摘要:AOP ,也称为“面向切面编程”,其大名早已如雷贯耳,是 Spring 框架的核心特性之一,相信各位小伙伴也早已听闻过,其最普遍的用法是“记录应用系统业务模块的操作日志”,今天我们就来分享介绍一下如何利用Spring AOP实现业务模块操作日志的记录。

内容:Spring  AOP,是“面向切面编程”的简称,可以起到“解耦业务模块”的作用,深层次的作用可以利用网上一位博主所说的一句话进行概括,即:

“AOP 可以实现在不修改源代码的情况下给程序动态统一添加功能,而不需要破坏某个操作业务模块代码的完整性”

对于Spring AOP,在这里有必要再啰嗦一番其核心要素,“面向切面编程”,一听就知道其核心要素是“切面”,而“切面”并非只是单纯存在的玩意,它由两大部分组成,“切点PointCut”+“通知Notice”,下面,让我用“通俗易懂”的语句表达出来吧:

“切点”:在什么地方触发我们自定义的操作(定义的是“何处”)

“通知”:在什么时候执行我们自定义的操作,同时定义好“自定义的操作”具体是什么!

“切面”:切点 + 通知;即在什么时候,在哪个地方触发执行什么样的操作!

好了,若需要具体的、深层次的关于专业术语的介绍、剖析,可以上官网或者博客找找相应的介绍吧!下面我们就进入实际的代码实战过程!

(1)首先,我们当然需要建立一个“记录日志的数据库表”,sys_log,其DDL定义如下所示:

CREATE TABLE `sys_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `operation` varchar(50) DEFAULT NULL COMMENT '用户操作',
  `method` varchar(200) DEFAULT NULL COMMENT '请求方法',
  `params` varchar(5000) DEFAULT NULL COMMENT '请求参数',
  `time` bigint(20) NOT NULL COMMENT '执行时长(毫秒)',
  `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址',
  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统日志';

然后,采用Mybatis逆向工程生成相应的Entity、Mapper、Mapper.xml,之后便是等待着被调用!

(2)然后,我们定义一个注解LogAnnotation,这个注解将用于应用系统中“所有需要触发记录日志”的操作模块对应的方法之上,在后面大家会发现,正是这种方式,才实现了所谓的“服务模块解耦”、“在不修改源代码的情况下给程序动态统一添加功能”的作用。其完整源代码如下所示:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
	//value将用于存储 “具体的操作模块的操作描述”
    String value() default "";
}