我试图将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>
答案 0 :(得分:1)
这些就是我认为可以帮助您的事情:
@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
注释对我有帮助。