我们以下面一个UserController为例来讲解
@RestController @RequestMapping("/api/user") @Slf4j public class UserController { @Resource private UserDao userDao; @Log("查询所有用户") @GetMapping("/list") public Result getList(@RequestParam String page,@RequestParam String limit){ PageHelper.startPage(Integer.valueOf(page),Integer.valueOf(limit)); List<User> users = userDao.selectAll(); PageInfo pageInfo = new PageInfo(users); return Result.operating("分页查询成功", true, ResultCode.SUCCESS, pageInfo.getList(), pageInfo.getTotal()); } }
@Log注解如下:
@Target(value = {ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { //日志类型,1登录日志,2操作日志 String type() default "2"; //说明 String value(); }
切面类如下:
@Component @Aspect @Slf4j public class SystemLogAspect { @Pointcut("@annotation(com.zwh.common.annotation.Log)") public void SystemLogAction() { } @Around("SystemLogAction()") public Object aroundHandle(ProceedingJoinPoint joinPoint) throws Throwable {// 从RequestContextHolder中获取ServletRequestAttributes ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // 从ServletRequestAttributes中获取request HttpServletRequest request = attributes.getRequest(); String requestURI = request.getRequestURI(); // 从request中获取requestURI Object target = joinPoint.getTarget(); String name = target.getClass().getName(); // 获取全类名 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); String name1 = signature.getName(); // 获取方法的名字 // 获取方法上的注解 Log annotation = signature.getMethod().getAnnotation(Log.class); // 获取方法的参数 Object[] args = joinPoint.getArgs(); // 参数名数组 String[] argNames = signature.getParameterNames(); Object responseBody = joinPoint.proceed();//返回体 return responseBody; } }
启动项目,浏览器访问:http://localhost:8090/api/user/list?page=1&limit=10
1、获取全限定类名
Object target = joinPoint.getTarget();
String name = target.getClass().getName();
target和name值如下:

2、获取方法的名字
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); String name1 = signature.getName(); // 获取方法的名字
signature和name1的值如下:

3、获取方法上的注解
Log annotation = signature.getMethod().getAnnotation(Log.class);
annotation的值如下:
![]()
4、获取方法的参数的值
Object[] args = joinPoint.getArgs();
args的值如下:

5、获取参数名数组
String[] argNames = signature.getParameterNames();
argNames的值如下:

6、调用切入点方法
Object responseBody = joinPoint.proceed();
浙公网安备 33010602011771号