我希望新手能够帮助我,因为我是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());
}
然后不再执行该方面。我认为对于任何带有注释“ @ResuiresCheck”的方法,都应执行该方面,但这似乎并非如此。还是我错过了什么?
谢谢您的帮助!
无法使用Spring AOP截获内部呼叫。
来自documentation的相关信息
由于Spring AOP框架基于代理的性质,根据定义,目标对象不会被拦截。对于JDK代理,只能对代理进行公共接口方法调用被拦截。使用CGLIB,可在代理被拦截(甚至包可见的方法,如果必要)。但是,通过代理进行的常见互动应始终通过公共签名设计。