簡體   English   中英

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

[英]Spring AOP with @annotation(…) seems not to work in some cases

我是 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 無法攔截內部調用。

文檔中的相關信息

由於 Spring 的 AOP 框架基於代理的性質,根據定義,目標 object 內的調用不會被攔截。 對於 JDK 代理,只能攔截代理上的公共接口方法調用。 使用 CGLIB,代理上的公共和受保護的方法調用被攔截(如果需要,甚至包可見的方法)。 但是,通過代理的常見交互應始終通過公共簽名進行設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM