为啥我的 @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 应用程序识别?的主要内容,如果未能解决你的问题,请参考以下文章