Spring 中使用@Aspect 控制自定义注解

来源:互联网 发布:在手机淘宝上如何开店 编辑:程序博客网 时间:2024/05/28 06:07

Spring 中使用@Aspect 控制自定义注解

转载一篇介绍@Aspect

1.定义系统日志注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {

String value() default "";

}

2.定义切面处理类

package com.kxs.common.aspect;import com.google.gson.Gson;import com.kxs.common.annotation.SysLog;import com.kxs.common.utils.HttpContextUtils;import com.kxs.common.utils.IPUtils;import com.kxs.modules.sys.entity.SysLogEntity;import com.kxs.modules.sys.entity.SysUserEntity;import com.kxs.modules.sys.service.SysLogService;import org.apache.shiro.SecurityUtils;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.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import java.lang.reflect.Method;import java.util.Date;/** * 系统日志,切面处理类 *  * @author  * @email  * @date  */@Aspect@Componentpublic class SysLogAspect {    @Autowired    private SysLogService sysLogService;    @Pointcut("@annotation(com.kxs.common.annotation.SysLog)")//指向自定义注解路径    public void logPointCut() {     }    /**     * 切面记录系统日志     * @param point     * @return     * @throws Throwable     */    @Around("logPointCut()")//    public Object around(ProceedingJoinPoint point) throws Throwable {        long beginTime = System.currentTimeMillis();        //执行方法        Object result = point.proceed();        //执行时长(毫秒)        long time = System.currentTimeMillis() - beginTime;        //保存日志        saveSysLog(point, time);        return result;    }//保存日志    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {        MethodSignature signature = (MethodSignature) joinPoint.getSignature();        Method method = signature.getMethod();        SysLogEntity sysLog = new SysLogEntity();        SysLog syslog = method.getAnnotation(SysLog.class);        if(syslog != null){            //注解上的描述            sysLog.setOperation(syslog.value());        }        //请求的方法名        String className = joinPoint.getTarget().getClass().getName();        String methodName = signature.getName();        sysLog.setMethod(className + "." + methodName + "()");        //请求的参数        Object[] args = joinPoint.getArgs();        try{            String params = new Gson().toJson(args[0]);            sysLog.setParams(params);        }catch (Exception e){        }        //获取request        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();        //设置IP地址        sysLog.setIp(IPUtils.getIpAddr(request));        //用户名        String username = ((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUsername();        sysLog.setUsername(username);        sysLog.setTime(time);        sysLog.setCreateDate(new Date());        //保存系统日志        sysLogService.save(sysLog);    }}
原创粉丝点击