为什么我的 @Aspect 不能被我的 SpringBoot 应用程序识别?

Why my @Aspect is not recognized by my SpringBoot Application?

我想用 spring 引导测试 AOP,因此我在我的

中导入了这个依赖项

pom.xml

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

然后我创建了两个classes,一个用于配置,另一个负责编织方面。

AspectConfig.class

@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.douineau.aspect")
public class AspectConfig {

}

还有另一个 class,除了测试它是否运行良好之外没有什么特别的:

ControllerAspect.class

@Aspect
@Component
public class ControllerAspect {
    
    @Pointcut("execution(* com.douineau.aspect.ControllerAspect.testAop(..))")
    public void callingRequest() {
        System.out.println("Pointcut method done");
    }
    
    @Before("callingRequest()")
    public void beforeAdvice( ) {
        System.out.println("Before advice");
    }

    public void testAop() {
        System.out.println(getClass().getName());
    }

}

当我调用方法 c.testAop() 时,它应该使用参数化 @Pointcut("execution(* com.douineau.aspect.ControllerAspect.testAop(..))") 注释进入方法 callingRequest()

但它没有...

另一件需要真正理解的事情是,将 @EnableAspectJAutoProxy 注释直接放在 SpringBoot 主启动器的 @SpringBootApplication 之后是否更合适?

感谢您的帮助。

乔斯

来自Spring框架参考documentation:

Advising aspects with other aspects? In Spring AOP, aspects themselves cannot be the targets of advice from other aspects. The @Aspect annotation on a class marks it as an aspect and, hence, excludes it from auto-proxying.

此处的切入点表达式针对的是 Aspect ,这在 Spring AOP 中是不可能的。

对于 Spring 引导应用程序,无需显式声明 @EnableAspectJAutoProxy。请仔细阅读此

只要遵循 recommeded structuring,就应该选择您的方面,而无需明确指定 @ComponentScan