AOP未触发自定义TrackExecutionTime注解问题求助
问题解决:AOP切面未触发自定义注解
TrackExecutionTime 核心原因
Spring AOP仅作用于Spring容器管理的Bean,你的测试类ExecutionTimeTrackerTest未被Spring容器接管,且测试未加载Spring上下文,导致切面无法拦截方法调用。IDEA提示“advice advises no method”是因为编译器找不到被注解的Spring Bean方法。
解决步骤
1. 让测试类纳入Spring容器管理并加载测试上下文
修改测试类,添加Spring Boot测试相关注解,确保Spring容器能加载切面和测试Bean:
import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.stereotype.Component; import java.util.Arrays; import static org.junit.jupiter.api.Assertions.assertEquals; // 标记为Spring组件,让容器管理 @Component // 启用Spring Boot测试上下文 @SpringBootTest public class ExecutionTimeTrackerTest { @Test @TrackExecutionTime public void someMethod(){ int[] randomNumbers = {582, 15, 596, 827, 779, 426, 153, 557, 394, 12}; Arrays.sort(randomNumbers); int index = Arrays.binarySearch(randomNumbers, 827); assertEquals(9, index); } }
2. 确保切面的注解表达式精准(可选)
如果TrackExecutionTime注解和切面不在同一包,建议在@Around中使用全类名,避免包名冲突:
// 替换com.yourpackage为注解实际的包路径 @Around(value = "@annotation(com.yourpackage.TrackExecutionTime)")
3. 检查切面的条件加载注解
确认配置文件中aspect.enabled的值为true,或者直接移除@ConditionalOnExpression("${aspect.enabled:true}")(若无需开关控制),防止切面因条件不满足未被加载。
4. 确认依赖完整性
如果是Maven项目,确保pom.xml已引入Spring AOP和测试依赖:
<dependencies> <!-- Spring AOP依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- Spring Boot测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
验证
运行测试类,查看日志输出,若成功触发切面,会看到类似如下日志:
INFO com.example.ExecutionTimeTrackerTest.someMethod >> Took : X mills
内容的提问来源于stack exchange,提问作者Basuki Nath Kumar
相关产品推荐
相关产品推荐

