Skip to content

Overridden aspect method runs twice #32865

Closed
@lexakimov

Description

@lexakimov

Affects: 6.1.6

If you extend an aspect class and override its method, then this method will be called twice.

Example in kotlin:

import mu.KLogging
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.stereotype.Component

annotation class CustomAnnotation()

@Aspect
open class CustomAnnotationAspect {
    @Around("execution (@CustomAnnotation * *.*(..))")
    open fun wrapExecution(pjp: ProceedingJoinPoint): Any? {
        logger.info { "start in super class" }
        val result = pjp.proceed()
        logger.info { "start in super class" }
        return result
    }

    companion object : KLogging()
}

@Aspect
class ExtendedCustomAnnotationAspect : CustomAnnotationAspect() {
    // don't matter if same @Around annotation presents or not
    override fun wrapExecution(pjp: ProceedingJoinPoint): Any? {
        logger.info { "start" }
        val result = pjp.proceed()
        logger.info { "finish" }
        return result
    }

    companion object : KLogging()
}


@Configuration
class Config {
    @Bean
    fun customAspect(): ExtendedCustomAnnotationAspect {
        return ExtendedCustomAnnotationAspect()
    }
}

then, when we call method annotated with @CustomAnnotation, we get output in console:

start
start
target method execution
finish
finish

expected output:

start
target method execution
finish

The call of ReflectionUtils.doWithMethods(...) in ReflectiveAspectJAdvisorFactory#getAdvisorMethods collects all user declared methods (methods of superclass and overridden methods), and all of them are used for making an advisors.

Снимок экрана_20240522_132928

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: backportedAn issue that has been backported to maintenance branchestype: bugA general bug

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions