自定义注释的方面不起作用

时间:2016-03-19 19:39:18

标签: java spring aspectj spring-aop

我正在尝试使用@Around建议为自定义注释编写方面但是为什么它不调用。 这是我的代码:

@Aspect
@Component
public class AspectMeasureTime {
    @Around(value = "execution(* com.beh.businesslayer..*(..)) && @annotation(measureTime)")
    public void measureTime(ProceedingJoinPoint pjp, MeasureTime measureTime) throws Throwable {
    /*some code*/
    }
}
@Configuration
@ComponentScan(basePackages = {"com.beh"})
@EnableAspectJAutoProxy(proxyTargetClass = false)
public class WebConfig {
}
package com.beh.businesslayer.businessworkflows.pagefetcher;
public class PageFetcherWriter implements ItemWriter, StepExecutionListener {
    @MeasureTime("timee")
    private void printString(Object s) {
        logger.info("entry = " + s);
    }
}
package com.beh.businesslayer.businessworkflows.pagefetcher;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MeasureTime {
    String value();
}

我试过没有这个注释的make joinpoint,它工作正常。尝试使用@annotation(com.beh.businesslayer.businessworkflows.pagefetcher.MeasureTime),它也无法正常工作。您知道为什么以及它应该是什么样的吗?

2 个答案:

答案 0 :(得分:2)

如果您要传入一个参数,那么您需要明确告诉AspectJ它正在传递

@Around(value = "execution(* com.beh.businesslayer..*(..)) && @annotation(measureTime) && args(measureTime)")
public void measureTime(ProceedingJoinPoint pjp, MeasureTime measureTime) throws Throwable {

答案 1 :(得分:2)

你的建议切入点表达似乎很好,你不需要改变它。

Spring AOP仅适用于公共方法,但它不会对您的private void printString(...)方法起作用。您需要将其更改为公开。

Spring AOP也不适用于任意对象,它只适用于Spring管理的对象,即Spring Beans。您需要通过将其注册到弹簧上下文来使PageFetcherWriter成为弹簧组件。有很多方法可以做到这一点,具体取决于您的设置和首选用例。使用@Component@Service对其进行注释是最常用的方法。获取托管bean的实例应该已经应用了Spring AOP拦截器,并且您的方面应该正常工作。

编辑 Stefano Cazzola发现了另一个问题:在@EnableAspectJAutoProxy,您需要将proxyTargetClass = false更改为proxyTargetClass = true

  

指示是否要创建基于子类的(CGLIB)代理   标准的基于Java接口的代理。默认值为false