【发布时间】:2018-05-17 09:23:03
【问题描述】:
我的方面运行了两次,但我看不出原因。也许有人可以指出我的错误? 这是一个代码:
-
为切入点创建注释
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface CustodianMetrics { String metricId(); } -
创建一个方面
@Aspect @Component("custodianMetricsAspect") public class CustodianMetricsAspect { private final MonitoringService monitoringService; @Autowired public CustodianMetricsAspect(MonitoringService monitoringService) { this.monitoringService = monitoringService; } @After("@annotation(custodianMetricsAnnotation)") public void count(CustodianMetrics custodianMetricsAnnotation) { Counter metric = monitoringService.metric(custodianMetricsAnnotation.metricId(), Counter.class); metric.inc(); } } -
为spring配置xml
<aop:aspectj-autoproxy> <aop:include name="path"/> </aop:aspectj-autoproxy> <aop:config> <aop:aspect id="custodianMetricsAspect" ref="custodianMetricsAspect"> <aop:after method="count" pointcut="@annotation(custodianMetricsAnnotation)"/> </aop:aspect> </aop:config>
我试图改变这个位置
@After("@annotation(custodianMetricsAnnotation) && execution(* *(..))")
但结果相同 - 方面运行两次。有什么建议吗?
【问题讨论】:
-
作为一个可能不相关的建议,您应该将切入点限制在包级别,即
execution(public * org.mypackage..*.*(..))。 -
如果您的
@Component方面的组件扫描处于活动状态,@Nikolas 的回答可能是正确的。但只是为了确保它确实是两次触发的同一个连接点,而不是另一个类因为它也带有相同的注释而被意外拦截,您可以将JoinPoint thisJoinPoint作为第一个参数添加到您的count()建议中,然后将其打印到像System.out.println(thisJoinPoint)这样的控制台。那你就真的知道了。
标签: java spring aspectj spring-aop