首页 > 解决方案 > 为什么我的 @Aspect 无法被我的 SpringBoot 应用程序识别?

问题描述

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

pom.xml

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

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

AspectConfig.class

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

}

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

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()时,它应该callingRequest()使用参数化@Pointcut("execution(* com.douineau.aspect.ControllerAspect.testAop(..))")注释输入方法。

但它不...

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

谢谢您的帮助。

乔斯

标签: spring-bootaspectjspring-aopaspectspring-aspects

解决方案


来自 Spring 框架参考文档

建议方面与其他方面?在 Spring AOP 中,切面本身不能成为其他切面通知的目标。类上的 @Aspect 注释将其标记为方面,因此将其排除在自动代理之外。

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

对于 Spring Boot 应用程序,不需要显式声明@EnableAspectJAutoProxy。请通读这个问题和答案

只要遵循推荐的结构,就应该选择您的方面而不明确指定@ComponentScan


推荐阅读