AOP切面逻辑实现后,原有正常业务代码失效?

问题代码展示

	@Override
    @Around("@annotation(sessionChange)")
    public void aroundSessionChange(SessionChange sessionChange) {
        SessionChangeAspect.super.aroundSessionChange(sessionChange);
    }
	/**
	 * 模拟登录
	 * @return
	 */
	@GetMapping("/logon")
	@SessionChange(increment = true)
	public String logon() {
		return "登录成功";
	}

问题分析与解决

  1. 切面方法的签名和用法

    • aroundSessionChange 方法的定义有误。@Around 注解的方法应该接收一个 ProceedingJoinPoint 类型的参数,而不是注解类型的参数。ProceedingJoinPoint 提供了继续执行拦截方法的能力。
  2. 调用 proceed() 方法

    • @Around 注解的方法内,你需要调用 joinPoint.proceed() 来继续执行原始的方法调用。如果没有调用这个方法,原始方法(如你的 logon 方法)将不会被执行,这解释了为什么没有输出。

正确的实现

这里是 aroundSessionChange 方法的一个正确实现示例:

@Around("@annotation(sessionChange)")
public Object aroundSessionChange(ProceedingJoinPoint joinPoint, SessionChange sessionChange) throws Throwable {
    try {
        // 在原始方法之前的逻辑,比如增加会话计数

        // 继续执行原始方法
        return joinPoint.proceed();

    } finally {
        // 在原始方法之后的逻辑,比如减少会话计数
    }
}

在这个实现中,joinPoint.proceed() 负责继续执行被 @SessionChange 注解标记的方法。这确保了你的 logon 方法能够被执行,并且其返回值(“登录成功”)能够被正确处理。

总结

logon 方法没有输出预期的消息,很可能是因为切面方法没有正确实现,导致原始方法没有被执行。请确保你的切面方法遵循了正确的 @Around 注解用法,并且正确地调用了 joinPoint.proceed()

你可能感兴趣的:(SpringBoot,Java,AOP)