Spring日志自定义注解

自动增加浏览次数

在运行getDetailById方法之前先执行日志注解里面的方法

        Map<String,Object> param = new HashMap<String,Object>(1);
	param.put("logType", "0");//访问
        param.put("businessId", dataId);//业务ID
        param.put("userId", user.getUserId());
        model.addAttribute("CHECK", gateWayService.getDetailById(param));//当前数据



	@LogAnnotation(operationName="添加浏览记录",operationType="addView")
	public Check getDetailById(Map<String,Object> param) {
		String dataId = (String) param.get("businessId");
		Check check = checkMapper.getAdviceById(dataId);
		return check;
	}

日志自定义注解自动增加浏览记录

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;

/* 
 * 日志自定义注解
 * 常用注解说明:  
 * 1. RetentionPolicy(保留策略)是一个enum类型,有三个值  
 * SOURCE        --  这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译后,Annotation的数据就会消失,并不会保留在编译好的.class文件里 
 * CLASS         --  这个Annotation类型的信息保留在程序源码中,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟 机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS。 
 * RUNTIME       --  在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的。 
 *  
 * 2.ElementType @Target中的ElementType用来指定Annotation类型可以用在哪些元素上 
 * TYPE(类型)    -- 在Class,Interface,Enum和Annotation类型上 
 * FIELD        -- 属性上 
 * METHOD       -- 方法上 
 * PARAMETER    -- 参数上 
 * CONSTRUCTOR  -- 构造函数上 
 * LOCAL_VARIABLE -- 局部变量 
 * ANNOTATION_TYPE   -- Annotation类型上 
 * PACKAGE           -- 包上 
 *  
 * 3.Documented    -- 让这个Annotation类型的信息能够显示在API说明文档上;没有添加的话,使用javadoc生成的API文件找不到这个类型生成的信息 
 */
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {

	/** 要执行的操作类型比如:add操作 **/
	public String operationType() default "";

	/** 要执行的具体操作比如:添加浏览记录 **/
	public String operationName() default "";

}

Spring AOP定义切点

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.alibaba.fastjson.JSON;

/**
 * 日志切面
 * 
 */
@Aspect
@Component
public class AccessLogAspect {

	@Autowired
	private AccessLogService accessLogService;

	private static final Logger logger = LoggerFactory.getLogger(AccessLogAspect.class);

	/**
	 * 第一个*代表所有的返回值类型 第二个*代表所有的类 第三个*代表类所有方法 最后一个..代表所有的参数。
	 * 
	 * @author 
	 */
	@Pointcut("@annotation(com.common.annotation.LogAnnotation)")      
	public void serviceAspect() {

	}

	/**
	 * 前置通知
	 * 
	 * @param joinPoint
	 * @author 
	 */
	@Before("serviceAspect()")
	public void doBefore(JoinPoint joinPoint) {
		if (logger.isInfoEnabled()) {
			logger.info("before " + joinPoint);
		}
		try {
			AccessLogVO log  = getServiceMthodParams(joinPoint);
			if("1".equals(log.getIsAdmire()))
			{
				//删除这条记录
				accessLogService.deleteAccessLog(log);
			}
			else
			{
				accessLogService.addAccessLog(log);
			}
			
		} catch (Exception e) {
			logger.error("==前置通知异常==");
			logger.error("异常信息:{}", e.getMessage());
		}
	}


	/**
	 * 获得切点参数
	 * @param joinPoint
	 * @return
	 * @throws Exception
	 * @author 
	 */
	private AccessLogVO getServiceMthodParams(JoinPoint joinPoint) throws Exception {
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
				.getRequest();
		// 请求的IP
		Object[] arguments = joinPoint.getArgs();
		String ip = request.getRemoteAddr();
		String params = JSON.toJSONString(arguments[0]);
		AccessLogVO log = JSON.parseObject(params, AccessLogVO.class);
		log.setAccessLogsId(CommonUtils.getUUID());
		log.setAccessIp(ip);
		log.setReadTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		return log;
	}

}
	<insert id="insertAccessLogMapper" parameterType="com.common.model.AccessLogVO">
		insert into pb_access_logs
		( access_logs_id,
		user_id,
		read_time,
		access_ip,
		log_type,
		business_id)
		values
		( #{accessLogsId,jdbcType=VARCHAR},
		#{userId,jdbcType=VARCHAR},
		#{readTime,jdbcType=VARCHAR},
		#{accessIp,jdbcType=VARCHAR},
		#{logType,jdbcType=VARCHAR},
		#{businessId,jdbcType=VARCHAR}
		)
	</insert>

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/82051444