为啥我的 @Aspect 无法被我的 SpringBoot 应用程序识别?

Posted

技术标签:

【中文标题】为啥我的 @Aspect 无法被我的 SpringBoot 应用程序识别?【英文标题】:Why my @Aspect is not recognized by my SpringBoot Application?为什么我的 @Aspect 无法被我的 SpringBoot 应用程序识别? 【发布时间】:2020-12-02 23:43:56 【问题描述】:

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

但事实并非如此……

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

感谢您的帮助。

乔斯

【问题讨论】:

【参考方案1】:

来自Spring框架参考documentation:

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

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

对于 Spring Boot 应用程序,无需显式声明 @EnableAspectJAutoProxy。请仔细阅读此question and answer

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

【讨论】:

谢谢,如果我理解得很好,我必须从另一个类调用testAop方法,我可以摆脱我的EnableAspectJAutoProxy注解,因为它已经被SpringBootApplication注解管理了? 不完全是 1. 您可以使用 Spring AOP 建议一个 Spring bean,这意味着,testAop() 方法应该在一个 bean 中(这不是一个方面)并且切入点指示符应该定位那个方法。 2. 是的,@EnableAspectJAutoProxy 是多余的,因为它由@SpringBootApplication 注解管理。 请用您的新代码更新问题

以上是关于为啥我的 @Aspect 无法被我的 SpringBoot 应用程序识别?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的背景图片在底部被我的 CSS 截断了?

为啥我的 Spring 应用程序无法识别有人已经登录?

为啥我的 Spring Boot Web 应用程序无法在 Gradle 中完全运行?

我被我的 python csv 作业困住了

我的macbook被我磁盘抹掉了,接下来怎么办

为啥我无法使用 Spring Boot 应用程序启动 Thymeleaf 模板?