Совет Spring AOP вызывается дважды

У меня есть следующий совет Spring AOP, и я не могу понять, почему он вызывается дважды:

@Component
@Aspect
public class LoggingAspects {

    Logger logger = LoggerFactory.getLogger(LoggingAspects.class);

    @AfterReturning(pointcut = "execution(public * com.A.B.C.service.impl.*.browse(..))",
            returning = "retVal")
    public Object onBrowse(DomainClass retVal) {
        logger.info("#######################Advice Called: +retVal);
        return null;
    }

}

Конфигурация такая же простая:

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

<bean id="loggingCASAspect" class="com.minervanetworks.xtv.stb.service.aspects.LoggingCASAspects"/> 

Я также попробовал следующий совет с тем же результатом (вызывается дважды).

@AfterReturning(pointcut="@annotation(com.A.B.C.service.impl.LOG)", returning="retVal")
public Object onBrowse(JoinPoint jp, DomainClass retVal) {
    logger.info("#######################Advice called! " + jp.toLongString()
    + " Target: " + jp.getTarget()
    + " Signature: " + jp.getSignature()
    + " Kind: " + jp.getKind()
    + " This: " + jp.getThis()
    + " Source Location: " + jp.getSourceLocation());

    return null;
}

Отладочная информация из приведенного выше регистратора:

2011-10-26 11:56:01,887 [INFO][com.A.B.C.service.aspects.LoggingAspects] #######################Advice called! execution(public abstract com.A.B.C.domain.DomainClass com.A.B.C.service.ContentManager.browse(java.lang.String,java.lang.String,java.lang.String,java.lang.Boolean)) Target: com.A.B.C.service.impl.ContentManagerImpl@62ad191 Signature: DomainClass com.A.B.C.service.ContentManager.browse(String,String,String,Boolean) Kind: method-execution This: com.A.B.C.service.impl.ContentManagerImpl@62ad191 Source Location: org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint$SourceLocationImpl@d324de2

Он отображается дважды с одинаковыми значениями.


person nb.alexiev    schedule 26.10.2011    source источник
comment
Я ненавижу спрашивать очевидное, но вызывается ли метод дважды?   -  person Dave Newton    schedule 26.10.2011
comment
Это было первое, что я проверил. Метод вызывается только один раз. Извините, что я не упомянул об этом в исходном вопросе.   -  person nb.alexiev    schedule 27.10.2011


Ответы (2)


<сильный>1. подсказка

Вы используете JavaConfig или XML? Если вы используете оба, возможно, Aspect обрабатывается контейнером Spring IoC дважды.

<сильный>2. подсказка

Я не комментирую аспекты с помощью аннотации @Component, попробуйте удалить ее, возможно, из-за того, что Spring обрабатывает ее дважды.

person davorp    schedule 27.10.2011
comment
У меня точно такая же проблема. Однако, если я удалю @Component, он перестанет вести журнал. Ниже приведен класс - person Vikky; 04.03.2019
comment
@Component (или другой стереотип Spring) требуется для сканирования компонентов. Если вам удалось решить проблему, удалив эту аннотацию, должен быть эффективен какой-то другой механизм подключения, кроме сканирования компонентов. - person deamon; 11.09.2019

Я обнаружил, что совет можно вызвать дважды, если аспект объявлен как область запроса. В этом случае один и тот же бин регистрируется дважды как перехватчик с разными именами: someAspect и scopedTarget.someAspect. Я решил эту проблему, сделав Aspect одноэлементным.

Версия: Spring Boot 2.0.x

person Xaltotun    schedule 16.10.2018