自定义注解+AOP实现对注解的解析实例

自定义注解+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;
    }

}

猜你喜欢

转载自blog.csdn.net/u011445756/article/details/89181747