为什么我的 @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
我想用 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