SpringBoot之AOP实现日志写入数据库(一)

上文已经介绍了如何把日志写入指定文件,现在想要把操作日志写入数据库,应该如何实现呢?前面学习了spring AOP思想Spring面向AOP,可是没有实例,这里就是一个很好的应用之处。

简单说一下要实现的内容:用户像学生表增加一个学生,则把用户id,用户操作,操作时间记录进入数据库。方便用户后来查看自己的操作记录。

显然这里至少有两个表。一个学生表,一个日志表。建表。

学生表
日志表

然后建立实体类

学生实体类
日志实体类

然后写xml文件和mapper接口

studentmapper.xml
这里命名studentmapper更加结构清晰
sysLogmapper.xml

然后写service层(这里只对日志写了service层,Student插入直接调用mapper接口的)

service接口
service实现

视图层很简单:一个form表单,传递学生信息

现在写控制类(用户点击注册,增加学生)

注意到这个:

@Log(value = "insertStudent")//这里添加了AOP的自定义注解

这个@Log注解是我自定义的一个注解,只要在需要把操作日志写入数据库的方法上加上这个注解,就可以在数据库写入日志了。

下面我们介绍如何利用aop实现上述功能:

首先先自定义一个注解Log。在config包下新建annotation,命名Log

@Target:

   @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

@Retention:

      @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

@Documented:

  @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

这样就写好了自定义的注解了。

下面利用AOP将@Log注解定义为切点,然后实现一个切面类LogAsPect,在切面类实现日志在数据库存储。这样只要增加了@Log注解,就会调用切面类,然后完成日志的写入。

这样,切面类也完成了。现在开始测试即可。

点击注册
返回成功页面
数据库插入成功
控制台打印log信息
数据库日志表也插入成功

不过这里日志表插入时候后面的时分秒出错了。不知道什么原因。待会再重新看一下。但是整个流程就是这样。

最后附上工程结果,其中utils包没用上

本文参考博文:Spring boot实现AOP记录操作日志


才疏学浅之处,切莫在意。

                                                                                                        ——2019.6.27  上午

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。