标签:dna col doc 系统 java 先后 script exp ret
基于注解和AOP实现的自定义日志系统。只需要两个类就能实现:
//注解类 //属性可以根据需要自行添加 @Target({ElementType.TYPE, ElementType.METHOD})//目标是方法 @Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取 //@Inherited @Documented public @interface SysLog { /** * 描述 */ String description() default ""; /** * 行为类型 * 1.违规行为;2.异常行为;3 一般行为 */ String behaviourType() default "3"; /** * 日志风险级别 * 1紧急、2重要、3一般、4信息 */ String level() default "4"; }
切面类:
@Aspect//声明这是一个事务切面 @Slf4j @Component//让其被spring管理 public class SysLogAspect { @Around("@annotation(sysLog)") @SneakyThrows public void around(ProceedingJoinPoint point, SysLog sysLog) { //-----------环绕通知开始----------- //保存日志的逻辑 Object obj = point.proceed(); //-----------环绕通知结束----------- //根据obj结果更新日志逻辑 } }
测试类:
//测试类 @SysLog(description = "这是一个测试",behaviourType = "1",level = "2") @PostMapping("/test") public String getTest(){ //业务逻辑 //... return "test"; }
方法二
其余一致,切面类做了修改:
@Aspect//声明这是一个事务切面 @Slf4j @Component//让其被spring管理 public class SysLogAspect { //声明切点 @Pointcut("@annotation(com.xx.xx.SysLog)") public void logPointCut(){} //执行的先后顺序是 环绕通知开始-->前置通知before-->后置通知after-->环绕通知结束 @Around("logPointCut()") @SneakyThrows public void around(ProceedingJoinPoint point, SysLog sysLog) { //-----------环绕通知开始----------- //ProceedingJoinPoint只能用于环绕通知,此参数写在前置和后置通知中会报错 //获取request、response ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestCOntextHolder.getRequestAttributes(); HttpServletRequest request = servletRequestAttributes.getRequest(); //保存日志的逻辑 //相当于自己写在controller中的代码 Object obj = point.proceed(); //-----------环绕通知结束----------- //根据obj结果更新日志逻辑 } //此外还可以加上前置通知 后置通知等 @Before("logPointCut()") public void doBefore(JoinPoint point){ //可通过point获取方法名和类名 String className = point.getTarget().getClass().getName(); String methodName = point.getSignature().getName(); } @After("logPointCut()") public void doAfter(JoinPoint point){ } }
持续更新!!!
标签:dna col doc 系统 java 先后 script exp ret
原文地址:https://www.cnblogs.com/flyinghome/p/13988066.html