关于接口方法的建议

时间:2014-01-16 15:42:17

标签: java spring

我正在尝试为接口中声明的方法添加around建议。

我的包结构如下:

  • 样本
  • sample.ifaces(此包具有SampleInterface,其方法声明为sampleOperation)
  • sample.ifaces.impl(此包具有实现sampleOperation的SampleImplementation)
  • sample.aspect(类SampleAspect)

在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,并且当实现的方法通过超类引用执行时,应该执行建议。

**更新**

我进一步分析了这一点。我的新包结构是:

  • 样品
  • sample.config(此包具有ConfigBean,在appContext.xml中定义为bean)
  • sample.ifaces(此包具有SampleInterface,其方法声明为sampleOperation)
  • sample.ifaces.impl(此包具有实现sampleOperation的SampleImplementation)
  • sample.aspect(类AppAspect在App上下文中定义为bean)

ConfigBean bean是从appContext初始化的。 initialize方法包含初始化SampleInterface引用的代码。

SampleInterface不是春天的豆子。

我尝试了各种组合。当我使用

@Pointcut("within( sample.config.*)") //-> Does work

当我使用

@Pointcut("within( sample.ifaces.*)")  //-> Does not work

执行切入点对我不起作用。它们只是成功编译但不会被调用。

1 个答案:

答案 0 :(得分:0)

您必须使用以下切入点表达式。我只是尝试了一个界面和一个方法,它对我有用。

within因为它限制了匹配到某些类型中的连接点(只是在使用Spring AOP时执行在匹配类型中声明的方法)

然后

execution,因为我希望仅在update()方法

上执行此操作
within(sample.ifaces.SampleInterface+) && execution(* sample(..))