自定义注解+AOP实现对注解的解析实例
程序员文章站
2022-05-23 18:27:47
...
自定义注解+AOP实现对注解的解析实例
1.业务场景:对所有增、删、改操作 进行操作日志记录
package com.rjwl.api.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*自定义注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OptLogAnnotation {
String value() default "";
}
package com.rjwl.api.common.aspect;
import com.rjwl.api.common.annotation.OptLogAnnotation;
import com.rjwl.api.entity.Admin;
import com.rjwl.api.entity.OperationLog;
import com.rjwl.api.service.OperationLogService;
import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* 自定义切面
*/
@Component
@Aspect
public class OperationLogAspect {
@Autowired
private OperationLogService operationLogService;
/**
* 声明切入点 所有使用注解OptLogAnnotation的地方
*/
@Pointcut(value = "@annotation(com.rjwl.api.common.annotation.OptLogAnnotation)")
public void pointCut() {
}
/**
* 对注解的解析 @After 在目标方法执行之后
* JoinPoint joinPoint 目标方法
* OptLogAnnotation optLogAnnotation 注释目标方法的注解对象
*/
@After("pointCut() && @annotation(optLogAnnotation)")
public void doAfter(JoinPoint joinPoint, OptLogAnnotation optLogAnnotation) {
Admin admin = (Admin) SecurityUtils.getSubject().getPrincipal();
OperationLog operationLog = new OperationLog();
operationLog.setAdminId(admin.getId());
operationLog.setAdminName(admin.getAdminName());
Object[] args = joinPoint.getArgs();
String operationRecord = optLogAnnotation.value();
StringBuilder optRecordSb = new StringBuilder(admin.getAdminName()).append(operationRecord);
for (Object arg : args) {
if (arg instanceof HttpServletRequest) {
operationLog.setLoginIp(getIpAddr((HttpServletRequest) arg));
continue;
}
optRecordSb.append(arg);
}
operationLog.setOperationRecord(optRecordSb.toString());
Date date = new Date();
operationLog.setGmt(date);
operationLog.setUpt(date);
operationLogService.getMapper().insertSelective(operationLog);
}
/**
* 获取登录用户IP地址
*
* @param request
* @return
*/
private String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if (ip.equals("0:0:0:0:0:0:0:1")) {
ip = "本地";
}
return ip;
}
}
上一篇: Web应用单点压力测试调优-第5季
下一篇: Spring源码解析之自定义标签的解析
推荐阅读
-
使用注解实现IOC与AOP的配置
-
SpringBoot使用AOP+注解实现简单的权限验证的方法
-
Java通过注解和反射 实现模拟 Hibernate Validator验证框架对实体对象的字段验证功能
-
Retrofit自定义请求参数注解的实现思路
-
Flutter利用注解生成可自定义的路由的实现
-
Spring AOP +自定义注解 + Spel表达式 实现审计日志
-
基于SpringBoot的操作日志管理(AOP+自定义注解方式)
-
Android头条面试题解析:Retrofit使用的注解是哪种,注解的底层是怎样实现的?(持续更新)
-
通过自定义注解+反射的形式,使用POI实现excel的导入导出
-
通过AOP+注解来实现参数的校验