我们以下面一个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();

 

posted on 2023-03-03 10:12  周文豪  阅读(1999)  评论(0)    收藏  举报