我正在尝试为接口中声明的方法添加around
建议。
我的包结构如下:
在SampleAspect中,我试图添加建议
@Component
@Configuration
@EnableAspectJAutoProxy
@Aspect
public class SampleAspect {
//@Pointcut("execution(public * sample.ifaces.impl.SampleImplementation .*(..))")
//@Pointcut("within(sample.ifaces.SampleInterface+) && execution(* sample*(..))")
//@Pointcut("execution(public * sample.ifaces.SampleInterface+.sample*(..))")
//@Pointcut("execution(* sample.ifaces.SampleInterface.*(..))")
//@Pointcut("execution(* sample.ifaces.SampleInterface+.*(..))")
@Pointcut("execution(* sample.ifaces.SampleInterface.sample*(..))")
public void retry() {
}
@Around("retry()")
private void retryHandler(ProceedingJoinPoint pjp){
Object o = null;
try {
logger.info("before exec");
o = pjp.proceed();
} catch (Exception e) {
logger.info("exception in exev");
} catch (Throwable e) {
logger.error("unknown");
}
}
}
我尝试了很多组合使它工作但它不起作用。我需要在接口级别为方法SampleOperation定义Pointcut,并且当实现的方法通过超类引用执行时,应该执行建议。
**更新**
我进一步分析了这一点。我的新包结构是:
ConfigBean
bean是从appContext初始化的。
initialize方法包含初始化SampleInterface
引用的代码。
SampleInterface
不是春天的豆子。
我尝试了各种组合。当我使用
@Pointcut("within( sample.config.*)") //-> Does work
当我使用
时@Pointcut("within( sample.ifaces.*)") //-> Does not work
执行切入点对我不起作用。它们只是成功编译但不会被调用。
答案 0 :(得分:0)
您必须使用以下切入点表达式。我只是尝试了一个界面和一个方法,它对我有用。
within
因为它限制了匹配到某些类型中的连接点(只是在使用Spring AOP时执行在匹配类型中声明的方法)
然后
execution
,因为我希望仅在update()方法
within(sample.ifaces.SampleInterface+) && execution(* sample(..))