一、前言
利用'spring'框架中'aop',我们可以实现业务代码与系统级服务进行解耦,例如日志记录、事务及其他安全业务等,可以使得我们的工程更加容易维护、优雅。如何在系统中添加相应的日志呢?
二、代码示例
1)添加依赖
<dependency>@b@ <groupId>org.springframework.boot</groupId>@b@ <artifactId>spring-boot-starter-aop</artifactId>@b@</dependency>
2)自定义注解
@Target(ElementType.METHOD)@b@@Retention(RetentionPolicy.RUNTIME)@b@@Documented@b@public @interface SysLog {@b@ String value() default "";@b@}
3)配置切面 - 将自定义的注解作为切入点,参数是'ProceedingJoinPoint'和'sysLog','ProceedingJoinPoint'用来获取当前执行的方法,'syslog'用来获取注解里面的值。
@Aspect@b@@Component@b@public class SysLogAspect {@b@ @Autowired@b@ private SysLogService sysLogService;@b@ private static Logger logger = LoggerFactory.getLogger(SysLogAspect.class);@b@@b@ @Around("@annotation(sysLog)")@b@ public Object around(ProceedingJoinPoint joinPoint,com.yami.shop.common.annotation.SysLog sysLog) throws Throwable {@b@ long beginTime = SystemClock.now();@b@ //执行方法@b@ Object result = joinPoint.proceed();@b@ //执行时长(毫秒)@b@ long time = SystemClock.now() - beginTime;@b@@b@ SysLog sysLogEntity = new SysLog();@b@ if(sysLog != null){@b@ //注解上的描述@b@ sysLogEntity.setOperation(sysLog.value());@b@ }@b@@b@ //请求的方法名@b@ String className = joinPoint.getTarget().getClass().getName();@b@ String methodName = joinPoint.getSignature().getName();@b@ sysLogEntity.setMethod(className + "." + methodName + "()");@b@@b@ //请求的参数@b@ Object[] args = joinPoint.getArgs();@b@ String params = Json.toJsonString(args[0]);@b@ sysLogEntity.setParams(params);@b@@b@ //设置IP地址@b@ sysLogEntity.setIp(IPHelper.getIpAddr());@b@ //用户名@b@ String username = SecurityUtils.getSysUser().getUsername();@b@ sysLogEntity.setUsername(username);@b@ sysLogEntity.setTime(time);@b@ sysLogEntity.setCreateDate(new Date());@b@ //保存系统日志@b@ sysLogService.save(sysLogEntity);@b@ return result;@b@ }@b@@b@}
4)@SysLog(value)注解示例 - 在需要记录日志的方法上
@SysLog("修改角色")@b@@PutMapping@b@@PreAuthorize("@pms.hasPermission('sys:role:update')")@b@public ServerResponseEntity<Void> update(@RequestBody SysRole role){@b@ sysRoleService.updateRoleAndRoleMenu(role);@b@ return ServerResponseEntity.success();@b@}