1.导包问题
我们都知道,在编写SpringAOP(面向切面编程)时,需要导入一个aspectjweaver.jar的包,它的主要作用是负责解析切入点表达式。
但是在开发时,特别是maven工程中通过导入坐标的方式导依赖时,虽然代码提示功能很好用,但是一不留神就容易导成了别的包。
在第一次编写AOP案例时,我导入的依赖如下:
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
</dependency>
看起来好像是没有任何问题,而且我在编写基于XML的AOP时确实没有任何问题,功能都可以正常实现。
但是,我突发奇想直接删除了Application.xml(Spring核心配置文件),而将全部spring的配置采用注解来实现,在加入AOP之前,依赖注入什么的都正常,但是当我加入AOP之后,给我报了一大堆的错,其中还包括依赖注入失败,我瞄准了最后一句Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can’t find referenced pointcut pt1的报错,因为这是跟切入点表达式(pt1)相关的,根据这个在网上终于找到了问题所在,于是我将以上依赖的坐标换成了下面的:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
瞬间一切正常。。。。白白浪费了大把的时间去找错,问题却出在导包上面。而且这个包对于基于xml的AOP还是可以正常使用的,但是换了注解AOP就不行了,貌似会影响Spring的依赖注入,更别谈什么AOP的环绕通知了,不知道是因为版本的原因还是因为groupId,这个因为时间原因没有深究。这个问题只适用于初学者,真正开发项目一般会使用springboot,有了springboot的依赖管理就不用我们自己去导这个包了,所以就避免了这个问题。
2.spring注解AOP通知顺序紊乱的问题
另外需要注意的一个点也一起记录一下:
我们知道AOP中的通知类型分为前置通知、后置通知、异常通知、最终通知和环绕通知,前面四个根据名称很容易就能理解了,
- 前置通知:在切入点方法调用之前执行的通知。
- 后置通知:在切入点方法调用之后执行的通知。(无法与异常通知同时执行)
- 异常通知:在程序发生异常时执行的通知。(无法与后置通知同时执行)
- 最终通知:切入点方法调用之后执行的通知,与后置通知不同的是,无论切入点方法是否正常执行都会执行该通知。
最后一个环绕通知,通俗来讲就是以上四种通知的集合。在实际编写环绕通知时,可以在环绕通知内部自定义封装前面四种通知,因为在环绕通知中必须通过ProceedingJoinPoint显式的调用目标方法,我们可以根据调用的位置,在该位置前面、后面、catch块、finally块放入自己的代码,分别对应前置通知、后置通知、异常通知和最终通知,也就是包含了目标方法调用的一整个期间,所以命名为环绕通知。
在基于xml的AOP中,只要配置正确了,spring会严格按照以上规定的顺序执行,但是在基于注解的AOP中,前面4种通知的调用会发生顺序紊乱,在实际开发中,这种问题难免会影响业务的正常流程,最直观的解决方法有两种:
- 使用基于xml的AOP。
- 避免使用这四类通知,直接使用环绕通知,将这四类通知的内容放到环绕通知中。(常用)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35860.html