为什么 AOP 在我的 Spring Boot 应用程序中不起作用?

V. *_*lev 6 spring aspectj spring-aop spring-boot

我尝试将 AspectJ 添加到我的 Spring Boot 项目之一但失败了。我尝试创建非常简单的 Spring Boot 项目,但它也不起作用。我添加了 @EnableAspectJAutoProxy 注释等,但仍然相同。我究竟做错了什么?

这是这个简单项目的代码:

@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";
    }

}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Pas*_*ibi 5

我认为这些对你有帮助:

  • 您忘记添加方面类的 bean:
@Bean MessageAspect messageAspect() {  
  return new MessageAspect();
}
Run Code Online (Sandbox Code Playgroud)
  • 使用@EnableAspectJAutoProxy(proxyTargetClass = true)

  • 确保您的@Aspect 注释已被扫描。您可以使用 @ComponentScan("myAspectPackageContainer.*")

  • @Component使用时不再需要注释@Aspect

  • 在表达式中使用方法修饰符 "execution( public * com.example.demo..."
  • 在你的表达结束时使用"myPackage.*.*(..)"
  • 检查这两个依赖项:
<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>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,@ControllerAdvice如果您只需要关注控制器类,则可以使用

  • 我的方面类没有自动装配为 bean。问题出在文件扩展名上。我已将其创建为具有 .aj 扩展名的 Aspect,但忘记了它(IDE​​A 隐藏了扩展名)。当我将扩展名更改为 .java 时,一切都开始正常工作。 (3认同)