Spring AOP问题:自定义注解标注的方法未触发Advice执行
咱们一步步来梳理你可能遗漏的点,逐个排查应该能解决问题:
确保目标类是Spring容器管理的Bean
你的切面类已经加了@Component被Spring管理,但包含build()方法的目标类呢?如果这个类是你手动通过new关键字创建的实例,而不是通过Spring容器获取的(比如用@Autowired注入),那Spring AOP是无法对它生成代理的,自然切面不会触发。一定要保证目标类也被Spring的注解(比如@Component、@Service等)标记,并且被Spring扫描到。修正切点表达式的细节问题
看你切面里的@Before("@annotation(validateBeforeBuild )"),参数名后面多了个空格,虽然理论上不影响,但保险起见改成@Before("@annotation(validateBeforeBuild)"),或者直接用注解的全限定类名(比如@Before("@annotation(com.yourpackage.ValidateBeforeBuild)")),这样可以避免因为包导入或者参数名匹配的问题导致切点不生效。确认build()方法的访问权限
Spring AOP默认只支持代理public方法,如果你的build()方法是private、protected或者默认包访问权限,切面是不会触发的。检查一下方法修饰符,确保是public。避免同一类内部的方法调用
如果调用build()的代码是在目标类自己的另一个方法里(比如this.build()),这种内部调用是不会经过Spring代理对象的,AOP自然不会生效。解决办法有几种:- 把目标对象自己注入到类中(比如
@Autowired private TargetClass self;),然后用self.build()调用; - 通过
ApplicationContext获取代理对象来调用; - 改用AspectJ编译时或加载时织入(需要额外配置)。
- 把目标对象自己注入到类中(比如
检查@EnableAspectJAutoProxy的配置有效性
你说已经加了@EnableAspectJAutoProxy,但要确认这个注解所在的配置类是否被Spring扫描到。比如配置类所在的包是否在@ComponentScan的扫描范围内?如果配置类没被加载,那AOP功能根本没开启。另外,如果是Spring Boot项目,也可以把这个注解加在启动类上,更稳妥。验证日志配置是否正确
切面里用的是LOGGER.info(),如果你的日志配置(比如logback.xml、application.yml)中,把AspectForBuildInBuilders类的日志级别设置成了WARN或者ERROR,那INFO级别的日志就不会输出。可以临时改成DEBUG级别试试,或者直接在切面里加个断点,看方法有没有被调用(比日志更直接)。检查切面的优先级和其他AOP冲突
如果项目里还有其他切面,可能存在优先级问题导致你的切面没执行。可以给你的切面类加上@Order(1)(数字越小优先级越高),确保它先被执行。
如果以上排查都做完了还是没解决问题,你可以补充这些信息:
- 包含
build()方法的目标类代码; - 调用
build()方法的具体代码; - Spring配置类的完整代码;
- 项目的日志配置文件片段。
内容的提问来源于stack exchange,提问作者Prashant

