java - Spring AOP - 方面不拦截任何东西
问题描述
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>...</name>
<description>...</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
应用程序.java
@SpringBootApplication
public class Application implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
new Test().test();
}
}
测试.java
public class Test {
public void test() {
System.out.println("TEST");
};
}
方面.java
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class Aspect {
@Around("execution(* Test.*(..))")
public Object test(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Aspect: " + joinPoint.getSignature().getName());
return joinPoint.proceed();
}
}
我想我都发布了!告诉我是否缺少某些东西。
我在Aspect的方法测试中放了一个断点,什么都没有。他的默认构造函数在 Spring 初始化期间被调用,因此当 Context 启动时他被正确初始化。
我不知道为什么,但 Aspect 没有拦截任何东西。我尝试了不同的切入点,特别是我需要拦截带有一些自定义异常的自定义注释,我简化了代码以将其发布在这里。
无论如何,即使运行这段代码,我也无法从Aspect.java类System.out.println
的test()
方法中得到它。
编译过程很好。即使运行该应用程序也一切正常,除了这个。
我在 IntelliJ IDEA 上,如果这在某些情况下会干扰我不知道的编织过程。
但也许这个错误比我想象的更愚蠢。
谢谢。
解决方案
Spring AOP 只能为 Spring 组件创建代理并向它们添加方面拦截器(建议)。您的课程Test
不是 a @Component
,我看不到任何配置从中创建 Spring bean。
推荐阅读
- c++ - 给函数名取别名的最快方法
- python - 替换 numpy 数组的行
- react-native - 尝试在 Android ReactNative 中的空对象引用上调用虚拟方法“double android.location.Location.getLatitude()”
- android - 我可以在本机反应中将函数回调传递给无头 js 吗?
- javascript - REACTJS单击卡片时如何仅折叠一张卡片(面板)
- r - gganimate 频率直方图以显示每个附加样本后的变化
- regex - 正则表达式:省略街道地址直到城市?
- java - 如何在特定时区的特定时间(如 12:00:00.000)获取日期实例?
- sql - 使用查询/代码动态创建的 SQL 作业
- java - 我应该如何在 Google Play 管理中心启用我的 AdMob 真实 ID?