为什么AOP在我的Spring Boot应用程序中不起作用?
我试图将AspectJ添加到我的一个Spring Boot项目中,但失败了。我试图创建一个非常简单的SpringBoot项目,但它也不起作用。我已经添加了@enableSpectRoxy注释等,但仍然得到了相同的结果。我做错了什么 这是这个简单项目的代码:为什么AOP在我的Spring Boot应用程序中不起作用?,spring,spring-boot,aspectj,spring-aop,Spring,Spring Boot,Aspectj,Spring Aop,我试图将AspectJ添加到我的一个Spring Boot项目中,但失败了。我试图创建一个非常简单的SpringBoot项目,但它也不起作用。我已经添加了@enableSpectRoxy注释等,但仍然得到了相同的结果。我做错了什么 这是这个简单项目的代码: @SpringBootApplication @EnableAspectJAutoProxy(proxyTargetClass = true) public class DemoApplication { public static
@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Aspect
@Component
public class MessageAspect {
@Before("execution(* com.example.demo.MessageController.mainMethod())")
public void beforeMethod() {
System.out.println("before method");
}
}
@RestController
public class MessageController {
@RequestMapping(value = "/")
public String mainMethod() {
return "result from mainMethod";
}
}
Maven依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧启动机aop
我认为这些对您有帮助:
- 您忘记添加方面类的bean:
- 使用
而不使用@enableAspectProxy
(proxyTargetClass=true)
- 确保已扫描您的
注释。您可以使用@Aspect
@ComponentScan(“myAspectPackageContainer.*)
- 当使用
时,您不再需要@Aspect
注释@Component
- 在表达式中使用方法修饰符执行(public*com.example.demo…
- 在表达式末尾使用
“myPackage.*.*(..)”
- 检查以下两个依赖项:
org.aspectj
aspectjrt
1.8.7
org.aspectj
aspectjweaver
1.8.7
顺便说一句,如果您只需要显示控制器类,您可以使用
@ControllerAdvice
删除@Component
注释在这种情况下帮助了我。尝试在main方法()中添加两个。
如下所示:com.example.demo.MessageController.main方法(…)
然后看看它是否有效。另外,尝试在spring配置中将aspect类声明为bean,看看这是否有什么不同。我的aspect类不是作为bean自动连接的。问题在于文件扩展名。我创建了一个扩展名为.aj的aspect,但忘记了它(IDEA隐藏扩展名).当我将扩展名改为.java时,一切都开始正常工作。@V.Perfilev你救了我一天
@Bean MessageAspect messageAspect() {
return new MessageAspect();
}
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.7</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>