AspectJ, SpringAOP, Aspect запускается дважды - PullRequest
0 голосов
/ 17 мая 2018

Мой аспект работает дважды, и я не вижу причины, почему.Может быть, кто-то может указать мне на мою ошибку?Вот код:

  1. Создание аннотации для pointcut

    @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. Настройка 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(* *(..))")

Но тот же результат - аспект выполняется дважды.Есть предложения?

1 Ответ

0 голосов
/ 17 мая 2018

Это происходит потому, что вы настроили аспект дважды - и конфигурацию Spring XML, и аннотацию @Aspect.

Прочтите примечание в разделе 8.1.2 Возможности и цели Spring AOP документации Spring Framework содержит следующее:

Один такой выбор, который имеет отношение к этой главе, - это выбор какой-либо инфраструктуры AOP (и какой стиль AOP) выбирать.У вас есть выбор AspectJ и / или Spring AOP, и у вас также есть выбор либо в стиле аннотации @AspectJ, либо в стиле конфигурации XML Spring.

В этом случае на основеИсходя из моего личного опыта, я настоятельно рекомендую вам придерживаться аннотаций.Однако это зависит от вашего личного вкуса.Вы можете найти 8.4 Выбор стиля объявления AOP для использования релевантный.

Редактировать: Если вы выбираете конфигурацию на основе аннотаций, не забудьте создать класс конфигурации Java вместо удаленного <aop:aspectj-autoproxy>... line.

@Configuration
@EnableAspectJAutoProxy
public class AspectJAutoProxyConfiguration { }
...