只有當連接點在特定類別或方法的控制流程中被呼叫時才匹配。例如:只有在 ServiceA.process() 執行期間呼叫 DAO.save() 才觸發通知。
缺點:需追蹤呼叫堆疊,系統開銷極大,不建議在追求高效能的應用中使用。
開發者繼承此類並實作:
public abstract class DynamicMethodMatcherPointcut extends StaticMethodMatcherPointcut {
// 靜態檢查(類名、方法名),可快取
public boolean matches(Method method, Class> targetClass) { ... }
// 動態檢查(方法參數),每次調用執行,不可快取
public boolean matches(Method method, Class> targetClass, Object[] args) { ... }
}
適用場景:根據參數值決定是否攔截,如「只有當 amount > 10000 時才啟動稽核通知」。
NameMatchMethodPointcut、JdkRegexpMethodPointcut、@AspectJ execution()),效能最佳且結果可快取。ControlFlowPointcut,除非業務極度依賴呼叫鏈上下文且併發量低。