Spring AOP建议被调用两次

时间:2011-10-26 09:31:49

标签: aop 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

它以完全相同的值显示两次。

2 个答案:

答案 0 :(得分:16)

<强> 1。提示

您使用JavaConfig还是xml? 如果您同时使用两者,可能是Spring IoC容器正在处理Aspect两次。

<强> 2。提示

我没有使用@Component annoation注释方面,尝试删除它,可能是因为Spring正在处理它两次。

答案 1 :(得分:0)

我发现,如果该方面被声明为请求范围,则该建议可以被调用两次。在这种情况下,同一个bean被两次注册为具有不同名称的拦截器:someAspectscopedTarget.someAspect。我通过使Aspect为单例解决了这个问题。

版本:Spring Boot 2.0.x