![3cb070e959899dcbc323646826833aa4.png](https://i-blog.csdnimg.cn/blog_migrate/565d80ad261c89eb1cbaac96e0d02a87.jpeg)
与基于代理类的AOP实现相比,基于XML的声明式ApectJ要便捷得多,但是它也存在着一些缺点,那就是要在Spring文件中配置大量的代码信息。为了解决这个问题,AspectJ框架为AOP的实现提供了一套注解,用以取代Spring配置文件中为实现AOP功能所配置的臃肿代码。
关于AspectJ注解的介绍,如表3-5所示。
![6690591bff56e1f2473aa8bd9f439f49.png](https://i-blog.csdnimg.cn/blog_migrate/f133ff67b5612b9c49521b835ab01bff.jpeg)
为了使读者可以快速地掌握这些注解,接下来重新使用注解的形式来实现3.4.1小节的案例,具体步骤如下。
(1)在chapter03项目的src目录下,创建com.itheima.aspectj.annotation包,将文件3-12的切面类MyAspect复制到该包下,并对该文件进行编辑,如文件3-15所示。
![cbfe4aedeb623493c66504c13d8dea1d.png](https://i-blog.csdnimg.cn/blog_migrate/942c2dba57936936cda03421e635737e.jpeg)
![66dc675cee2811cbbd655aaedf7e17d5.png](https://i-blog.csdnimg.cn/blog_migrate/5a0076d25f33702c9cc8e38f1980eaa3.jpeg)
![96d47c1316d2cf748b8043c5c99a9c29.png](https://i-blog.csdnimg.cn/blog_migrate/a8f1a5ab1958b30207bf5697cd88ac6b.jpeg)
![1d01a0915033539c868daff470304431.png](https://i-blog.csdnimg.cn/blog_migrate/f120253ccca0add679f496f7032d0305.jpeg)
在文件3-15中,首先使用@Aspect注解定义了切面类,由于该类在Spring中是作为组件使用的,所以还需要添加@Component注解才能生效。然后使用了@Poincut注解来配置切入点表达式,并通过定义方法来表示切入点名称。接下来在每个通知相应的方法上添加了相应的注解,并将切入点名称“myPointCut”作为参数传递给需要执行增强的通知方法。如果需要其他参数(如异常通知的异常参数),可以根据代码提示传递相应的属性值。
(2)在目标类com.itheima.jdk.UserDaoImpl中,添加注解@Repository("userDao")。
(3)在com.itheima.aspectj.annotation包下,创建配置文件applicationContext.xml,并对该文件进行编辑,如文件3-16所示。
![64866eb94690e374c200b92bcdd01a65.png](https://i-blog.csdnimg.cn/blog_migrate/ec68788efae20f4bebccdb0b2776459c.jpeg)
![7945f94060a981318b2c14858e799912.png](https://i-blog.csdnimg.cn/blog_migrate/b5d99e71bfbff52d421d915a153e2779.jpeg)
在文件3-16中,首先引入了context约束信息,然后使用元素设置了需要扫描的包,使注解生效。由于此案例中的目标类位于com.itheima.jdk包中,所以这里设置base-package的值为“com.itheima”。最后,使用来启动Spring对基于注解的声明式AspectJ的支持。
(4)在com.itheima.aspectj.annotation包中,创建测试类TestAnnotation,该类与文件3-14基本一致,只是配置文件的路径有所不同,如文件3-17所示。
![2970baf018c010f47e72f8de211577c6.png](https://i-blog.csdnimg.cn/blog_migrate/346f1aaf511c9281973004ac29c88178.jpeg)
![a1b79f83bb3eb4fe3b2a22792c8c4852.png](https://i-blog.csdnimg.cn/blog_migrate/6cfebdfbc81cf92ff6c5c5e981d2581c.jpeg)
执行程序后,控制台的输出结果如图3-10所示。
![552cdfbbde117f52d0f645151354a77d.png](https://i-blog.csdnimg.cn/blog_migrate/f6e61185d0d55c0112d70ea787ec3675.jpeg)
可以看出,基于注解的方式与基于XML的方式的执行结果相同,只是在目标方法前后通知的执行顺序发生了变化。相对来说,使用注解的方式更加简单、方便,所以在实际开发中推荐使用注解的方式进行AOP开发。
注意如果在同一个连接点有多个通知需要执行,那么在同一切面中,目标方法之前的前置通知和环绕通知的执行顺序是未知的,目标方法之后的后置通知和环绕通知的执行顺序也是未知的。