我的方面运行两次,我没有看到原因。也许有人可以指出我的错误? 这是一个代码:
为切入点创建注释
@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>
我试图在这个
上改变poitcut@After("@annotation(custodianMetricsAnnotation) && execution(* *(..))")
但结果相同 - 方面运行两次。有什么建议吗?
答案 0 :(得分:2)
之所以发生这种情况,是因为您已配置方面 两次 - Spring XML配置和@Aspect
注释。
阅读Spring框架文档的8.1.2 Spring AOP capabilities and goals部分中的注释,它说明了以下内容:
与本章相关的一个选择是选择哪种AOP框架(以及哪种AOP样式)。您可以选择AspectJ和/或Spring AOP,也可以选择@AspectJ注释样式方法或Spring XML配置样式方法。
在这种情况下,根据我的个人经验,我强烈建议您坚持使用注释。但是,这取决于您的个人品味。您可能会发现8.4 Choosing which AOP declaration style to use相关。
编辑:
如果选择基于注释的配置,请不要忘记创建Java配置类而不是删除<aop:aspectj-autoproxy>...
行。
@Configuration
@EnableAspectJAutoProxy
public class AspectJAutoProxyConfiguration { }