public enum ElementType {
/**用于描述类、接口(包括注解类型) 或enum声明 Class, interface (including annotation type), or enum declaration */
TYPE,
/** 用于描述域 Field declaration (includes enum constants) */
FIELD,
/**用于描述方法 Method declaration */
METHOD,
/**用于描述参数 Formal parameter declaration */
PARAMETER,
/**用于描述构造器 Constructor declaration */
CONSTRUCTOR,
/**用于描述局部变量 Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/**用于描述包 Package declaration */
PACKAGE,
/**
* 用来标注类型参数 Type parameter declaration
* @since 1.8
*/
TYPE_PARAMETER,
/**
*能标注任何类型名称 Use of a type
* @since 1.8
*/
TYPE_USE
}
这一步就是我们需要如何去处理我们的注解,这里面有四个方法,分别是@Before、@after、@Around、AfterReturning、AfterThrowing。
import com.fs.erp.mybatis.enums.OpLogType;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 系统日志注解
* 使用方法: 比如关于用户的日志可以分为“登录、退出登录” 此时type可以使用统一的字符串,这样可以将关于用户行为的日志全部查出 然后再根据不同的name将这些日志进一步细分
* name同时也用于前端显示 在上述例子中,可以将type设置为“user.operation” 登录的name设置为“用户登录” 退出登录的name设置为“退出登录”
*
* @author 奇怪
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OpLog {
/**
* 日志类型 用于做业务区分
*
* @return
*/
OpLogType type();
/**
* 日志名称 需要填充参数部分用{}占位,会根据params的值进行填充
*
* @return
*/
String name() default "";
/**
* 需要保存的参数 Spel表达式
*
* @return
*/
String[] params() default {};
/**
* 是否循环填充日志名称 会将params中的collection循环format
*
* @return
*/
boolean loopFormat() default false;
}
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.expression.EvaluationContext;
import org.springframework.stereotype.Component;
import java.util.*;
/**
* OpLog切面
*
* @author 奇怪
*/
@Slf4j
@Aspect
@Component
@ConditionalOnProperty(value = "op-logs.enabled", matchIfMissing = true)
public class OpLogAspector {
@Pointcut("@annotation(OpLog)")
public void opLogCutPoint() {
}
@Around(value = "opLogCutPoint(OpLog)")
public Object opLog(ProceedingJoinPoint joinPoint) throws Throwable {
// 具体业务
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。