问题描述
今天发现老工程里有个日志切面但是总是也没有执行过。
问题解决
1 )怀疑是execution表达式问题,先后改动了AspectJ表达式也不生效。
2 )在idea里打断点调试,tomcat启动后发现断点红圈没有打勾(这种情况就表示代码永远不会走进来)。
最后一看,这个被标注了@Aspect的切面类根本就不是spring管理的bean。加上了@Component一切正常。
总结
问题虽然很简单,但里面还是有几个知识点的:
1 ) spring2.5之后AOP已经全面被@Aspect等注解取代了,写起来很简便。
2 )@AspectJ风格的切面可以通过@Compenent注解标识其为Spring管理Bean,也可以在xml里配置bean,无论哪种必须配置为bean。@Aspect注解不能被Spring自动识别并注册为Bean。
aop:aspectj-autoproxy/用于开启Spring对@AspectJ风格切面的支持,但不能自动识别为bean,即使开启了 context:component-scan。
另外,spring允许abstract class里通过@Resource或@Autowired注入bean, 而abstract class本身不必是bean,也不可能是bean。