我正在尝试使用@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),它也无法正常工作。您知道为什么以及它应该是什么样的吗?
答案 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
。