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

时间:2018-08-12 17:46:44

标签: spring spring-boot aspectj spring-aop

我试图将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";
    }

}

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>

3 个答案:

答案 0 :(得分:1)

这些就是我认为可以帮助您的事情:

  • 您忘记添加方面类的bean:
@Bean MessageAspect messageAspect() {  
  return new MessageAspect();
}
  • 使用@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>

如果您只需要考虑控制器类的方面,可以使用@ControllerAdvice的方式

答案 1 :(得分:0)

您在已接受答案中的评论救了我,所以我认为最好将其添加为其他人的答案:

我使用了 IntelliJ 的“创建方面”,它创建了一个扩展名为 .aj 的文件。我不明白为什么其他类看不到我的新 Aspect 类,即使 IntelliJ 正在自动完成它。 IntelliJ隐藏文件扩展名,图标和类一样,不明显。

在 IntelliJ 项目管理器中将文件重命名为 .java 为我解决了这个问题。

答案 2 :(得分:-1)

在这种情况下,删除@Component注释对我有帮助。