专栏名称: hryou0922
目录
相关文章推荐
简单心理  ·  当闺蜜成为母亲:生育如何改变女性友谊 ·  4 小时前  
简单心理  ·  关于心理咨询,你可能会有的7个疑问 ·  昨天  
武志红  ·  4种认知,帮你建立稳定的内核 ·  昨天  
陈忻儿童心理  ·  自我是一个需要亲手搭建、不断生长的存在 ·  昨天  
51好读  ›  专栏  ›  hryou0922

Spring Boot系列十八 Spring AOP + 注解实现统一注解

hryou0922  · 掘金  ·  · 2018-05-09 02:19

正文

Spring Boot系列十八 Spring AOP + 注解实现统一注解

1. 概述

在一般系统中,当我们做了一些重要的操作时,如登陆系统,添加用户,删除用户等操作时,我们需要将这些行为持久化。本文我们通过Spring AOP和Java的自定义注解来实现日志的插入。此方案对原有业务入侵较低,实现较灵活

2. 日志的相关类定义

我们将日志抽象为以下两个类:功能模块和操作类型 使用枚举类定义功能模块类型ModuleType,如学生、用户模块

public enum ModuleType {
    DEFAULT("1"), // 默认值
    STUDENT("2"),// 学生模块
    TEACHER("3"); // 用户模块

    private ModuleType(String index){
        this.module = index;
    }
    private String module;
    public String getModule(){
        return this.module;
    }
}

使用枚举类定义操作的类型:EventType。如登陆、添加、删除、更新、删除等

public enum EventType {
    DEFAULT("1", "default"), ADD("2", "add"), UPDATE("3", "update"), DELETE_SINGLE("4", "delete-single"),
    LOGIN("10","login"),LOGIN_OUT("11","login_out");

    private EventType(String index, String name){
        this.name = name;
        this.event = index;
    }
    private String event;
    private String name;
    public String getEvent(){
        return this.event;
    }

    public String getName() {
        return name;
    }
}

3. 定义日志相关的注解

3.1. @LogEnable

这里我们定义日志的开关量,类上只有这个值为true,这个类中日志功能才开启

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface LogEnable {
    /**
     * 如果为true,则类下面的LogEvent启作用,否则忽略
     * @return
     */
    boolean logEnable() default true;
}

3.2. @LogEvent

这里定义日志的详细内容。如果此注解注解在类上,则这个参数做为类全部方法的默认值。如果注解在方法上,则只对这个方法启作用

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.METHOD, ElementType.TYPE})
public @interface LogEvent {
    ModuleType module() default ModuleType.DEFAULT; // 日志所属的模块
    EventType event() default EventType.DEFAULT; // 日志事件类型
    String desc() default  ""; // 描述信息
}

3.3. @LogKey

此注解如果注解在方法上,则整个方法的参数以json的格式保存到日志中。如果此注解同时注解在方法和类上,则方法上的注解会覆盖类上的值。

@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogKey {
     String keyName() default ""; // key的名称
     boolean isUserId() default false; // 此字段是否是本次操作的userId,这里略
     boolean isLog() default true; // 是否加入到日志中
}

4. 定义日志处理类

4.1. LogAdmModel

定义保存日志信息的类

public class LogAdmModel {
    private Long id;
    private String userId; // 操作用户
    private String userName;
    private String admModel; // 模块
    private String admEvent; // 操作
    private Date createDate; // 操作内容
    private String admOptContent; // 操作内容
    private String desc; // 备注
	set/get略
}

4.2. ILogManager

定义日志处理的接口类ILogManager 我们可以将日志存入数据库,也可以将日志发送到开中间件,如果redis, mq等等。每一种日志处理类都是此接口的实现类

public interface ILogManager {
    /**
     * 日志处理模块
     * @param paramLogAdmBean
     */
    void dealLog(LogAdmModel paramLogAdmBean);
}

4.3. DBLogManager

ILogManager实现类,将日志入库。这里只模拟入库







请到「今天看啥」查看全文