AspectJ,SpringAOP,Aspect运行两次

时间:2018-05-17 09:23:04

标签: java spring aspectj spring-aop

我的方面运行两次,我没有看到原因。也许有人可以指出我的错误? 这是一个代码:

  1. 为切入点创建注释

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    public @interface CustodianMetrics {
        String metricId();
    }
    
  2. 创建方面

    @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();
        }
    }
    
  3. 为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>
    
  4. 我试图在这个

    上改变poitcut
    @After("@annotation(custodianMetricsAnnotation) && execution(* *(..))")
    

    但结果相同 - 方面运行两次。有什么建议吗?

1 个答案:

答案 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 { }