Spring AOP初步总结(二)
该篇为Spring AOP的一个应用案例:系统日志
需求:将任何删除,更改或新增数据库的操作汇总到数据库中
步骤1:编写切面
@Aspect @Component public class SysLogAspect { @Autowired private SysLogService sysLogService; @Pointcut("@annotation(io.renren.common.annotation.SysLog)") //此处切点logPointCut是附在注解io.renren.common.annotation.SysLog上的 public void logPointCut() { } @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); } }
步骤2:编写注解SysLog
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysLog { String value() default ""; }
切面代码中sysLogService无疑就是存入数据库的操作了,写持久层和建表这里都不赘述了.
步骤3:编写业务层和持久层代码
/** * 冻结 */ @SysLog("冻结") @RequestMapping("/frezze") @RequiresPermissions("membercenter:membercard:freeze") public ResultInfo frezze(@RequestParam Long id){ return memberCardServiceRemote.freeze(id); }
至此,每次发出冻结会员卡的service请求并执行完之后,就会将请求的方法名,请求参数等信息存入数据库。
*******************************************************分割线**************************************************
文章仅作为自己学习记录所用,观点仅供参考,如需转载,请注明出处...