带有@annotation(..)的Spring AOP在某些情况下似乎不起作用



我是Spring AOP的新手。我实现了一个方面,它在我的一个方法上运行得很好。但是,当我重构方法并提取一些逻辑(包括用于触发方面的注释(时,就不再调用方面了。下文提供了更多详细信息。

我有类似的东西:

@RequiresCheck
public ServiceResult<AccountDto> save(AccountDto accountDto) {
// some logic here
accountRepository.save(account.toAccount());
// some logic there
return ServiceResult.ok(accountDto);
}

还有一个方面看起来与相似

@Around("@annotation(requiresCheck)")
public Object checkFullSemRights(ProceedingJoinPoint joinPoint) throws Throwable {
if (check()) {
return joinPoint.proceed();
}
throw new Exception();
}

这个代码工作得很好!当我重构第一个方法时,它看起来像这样:

public ServiceResult<AccountDto> save(AccountDto accountDto) {
// some logic here
return save2(accountDto.toAccount());
}
@RequiresCheck
public ServiceResult<AccountDto> save2(Account account) {
accountRepository.save(account);
// some logic there
return ServiceResult.ok(account.toAccountDto());
}

然后该方面不再执行。我认为应该为任何带有注释"@ResuresCheck"的方法执行方面,但这似乎不是真的。还是我错过了什么?

不能使用Spring AOP拦截内部调用。

文件中的相关信息

由于Spring的AOP框架的基于代理的特性根据定义,目标对象不被拦截。对于JDK代理,只有代理上的公共接口方法调用才能拦截。使用CGLIB,对代理被拦截(甚至包可见的方法,如果必要的(。但是,通过代理的常见交互应该始终通过公众签名进行设计。

最新更新