最近要做一个历史记录的功能 让我一下子就想到了日志那一块 就用了下AOP 说实话 是真的好用 真的爽
springboot+jpa+spring 框架 话不多说 上代码
前提:pom文件里面加上aop的包
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> package com.verify.demo.aop; import java.lang.reflect.Method; import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import javax.servlet.http.HttpServletRequest; 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.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.JSONObject; import com.verify.demo.annotations.HistoryAnnotation;import com.verify.demo.entity.Admin;import com.verify.demo.entity.SysHistory;import com.verify.demo.repository.HistoryRepository;import com.verify.demo.service.HistoryService;import com.verify.demo.utils.httpclient.CommonUtils;import com.verify.demo.utils.httpclient.DateUtils;@Aspect @Componentpublic class HistoryAopAction { private final Logger logger = LoggerFactory.getLogger(HistoryAopAction.class); @Autowired private HistoryRepository historyRepository; //自定义切点 //@Pointcut("execution(public * com.verify.demo.controller..*(..))")//定义自定义 注解切点 这样的话 每个方法上只需要加上切点就可以使用aop了 @Pointcut("@annotation(com.verify.demo.annotations.HistoryAnnotation)") private void pointCutMethod(){} @After("pointCutMethod()") // 使用上面定义的切入点 public void recordLog(JoinPoint joinPoint) { SysHistory sh=new SysHistory(); HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); Admin user = (Admin) CommonUtils.getUser(request); JSONObject jo=new JSONObject(); String s="";//获取请求路径url String requestURI = request.getRequestURI();//获取页面传过来的参数k v Map<String, String[]> parameterMap = request.getParameterMap(); Set<Entry<String,String[]>> entrySet = parameterMap.entrySet(); for (Entry<String, String[]> entry : entrySet) { String key = entry.getKey(); String[] value = entry.getValue(); String value2=value[0]; jo.put(key, value2); } if(user == null){ logger.warn("user 信息为空"); }else{ sh.setUid(user.getAdminid()); sh.setCondtion(jo.toString()); sh.setModularurl(requestURI); } //记录历史记录 try { Map<String,String> map = getHistoryMark(joinPoint); sh.setIdentify(Integer.parseInt(map.get("identify"))); sh.setModularname(map.get("modularname")); sh.setInserttime(DateUtils.getTimeStamp()); historyRepository.save(sh); }catch (Exception e){ logger.error("插入日志异常",e.getMessage()); } } private Map<String,String> getHistoryMark(JoinPoint joinPoint) throws ClassNotFoundException { Map<String,String> map = new HashMap<>(); String methodName = joinPoint.getSignature().getName();//获取切点的方法 two_element String targetName = joinPoint.getTarget().getClass().getName(); Class targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods();//获取class中所有的方法 for (Method method : methods){ if(method.getName().equals(methodName)){//标红的是自定义注解 HistoryAnnotation historyAnnotation = method.getAnnotation(HistoryAnnotation.class); map.put("identify",historyAnnotation.identify()); map.put("modularname",historyAnnotation.modularname()); } } return map; }} |
HistoryAnnotation 自定义注解
package com.verify.demo.annotations;
import java.lang.annotation.Retention; import java.lang.annotation.Target;import java.lang.annotation.ElementType;import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取 @Target(ElementType.METHOD)//目标是方法public @interface HistoryAnnotation { String url() default "";//url String identify() default "";//模块标识 String modularname() default "";//模块名称} |
使用自定义注解
@HistoryAnnotation(identify="1",modularname="二要素验证") @RequestMapping(value="/twoelement",produces="application/json;charset=UTF-8",method= RequestMethod.POST) public Result two_element(@RequestParam("name") String name,@RequestParam("idcard") String idcard,HttpServletRequest request) {............ } |
这样的话 就实现了历史记录这个功能了 想要记录这个方法的历史记录 就只需要加下这个自定义注解就可以了