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

标签 java annotations 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());
}

然后该方面不再执行。我认为对于任何具有注释“@ResuiresCheck”的方法都应该执行该方面,但这似乎并非如此。或者我错过了什么?

最佳答案

使用 Spring AOP 无法拦截内部调用。

相关信息来自documentation

Due to the proxy-based nature of Spring’s AOP framework, calls within the target object are, by definition, not intercepted. For JDK proxies, only public interface method calls on the proxy can be intercepted. With CGLIB, public and protected method calls on the proxy are intercepted (and even package-visible methods, if necessary). However, common interactions through proxies should always be designed through public signatures.

关于java - 带 @annotation(...) 的 Spring AOP 在某些情况下似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61226497/

相关文章:

java - Spring MVC : adding securityConfig. xml 以及dispatcherContext.xml

java - 如何在Android POST方法中与body一起使用Retrofit?

java - 如何在spring mvc中使 session 失效以实现注销

java - 如何在xml配置文件中指定spring处理程序拦截器的顺序?

java - 快速查询时 SQLite 上出现 CursorIndexOutOfBoundsException 错误

java - 尝试从巨大的文本文件读取/写入时出现 OutOfMemoryError

java - 是否可以限制 Java 注解的字段类型?

Java注解验证

java - Spring @Transaction方法通过同一个类内的方法调用,不起作用?

spring - 在Hibernate实体中使用aspectj