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种通知的调用会发生顺序紊乱,在实际开发中,这种问题难免会影响业务的正常流程,最直观的解决方法有两种:

  1. 使用基于xml的AOP。
  2. 避免使用这四类通知,直接使用环绕通知,将这四类通知的内容放到环绕通知中。(常用)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐