从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

时间:2022-04-17 12:30:58

     AOP是面向切面编程。切面是AOP中的一个术语,表示从业务逻辑中分离出来的横切逻辑,比如性能监控,日志记录,权限控制等,这些供暖都可以从核心的业务逻辑代码中抽离出去。也就是说通过AOP可以解决代码耦合的问题,让职责更加单一。其实很早以前就出现了AOP这个概念。最知名最强大的java开源项目就是AspectJ,它的前身是AspectWerkz。直到后来老罗 Rod Johnson写了Spring框架,成为Spring之父。他在Spring的IOC框架基础上又实现了一套AOP框架,后来发现自己掉进了深渊,后台就集成了AspectJ。我们现在用的最多的想必就是spring+AspectJ这种AOP框架了。

       一:Spring AOP

       1,Spring AOP:前置增强,后置增强,环绕增强(编程式)

       在Spring AOP的世界里,与AOP相关的术语挺多的。前面博客中提到的before方法,在Spring AOP里就叫Before Advice(前置增强)。有些人将Advice直译为“通知”,这是不合适的,因为它根本就没有“通知”的含义,而是对原有代码功能的“增强”。再者,CGLib中也有一个Enhancer类,它就是一个增强类。

       此外,像前面的after这样的方法就叫After Advice(后置增强),因为它放在后面来增强代码的供暖。

       如果能把before与after合并在一起,那就叫Around Advice(环绕增强)。

       下面要做的就是去实现一个所谓的增强类,让他们横切到代码中,而不是将这些写死在代码中。

        先来一个前置增强类,代码如下:

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


          再来一个后置增强类:

         从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


       最后看客户端把他们集成起来,看看如何调用:

      从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


          看上面的代码,其实spring aop还是比较简单的,当然我们完全可以只定义一个增强类,让它同时实现MethodBeforeAdvice与AfterReturningAdvice这两个接口,代码如下:

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


             这样只需一行代码就可以实现前置和后置增强了

 从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

          

         还可以把前置增强和后置增强的功能结合起来,无需实现两个接口,代码如下:

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


       以上就是Spring AOP的基本用法,但这只是编程式而已,Spring AOP还可以使用配置文件来使用AOP。

       2,Spring AOP:前置增强,后置增强,环绕增强(声明式)

      想看spring配置文件是如何写的:

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


           看上面的注释,其实使用ProxyFactoryBean就可以取代前面的ProxyFactory,其实它们就是一回事。interceptorNames改名为adviceNames或许会更容易让人理解,就是往属性里添加了增加类。此外如果只有一个增强类,可以使用下面的方法来简化:

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


       注意这里使用的是Spring 2.5+的Bean扫描特性,这样我们就无须在Spring配置文件里不断定义<bean id="x" class="xxx"/>,从而减少代码的配置。

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


          代码量确实是少了,我们将配置性的代码放入了配置文件中,这样也有助于后期维护。更重要的是代码只关注业务逻辑,而将配置放入文件中,这是一条最佳实践。

           除了上面提到的3类增强以外,还有两类增强需要了解下。

           3,Spring AOP:跑出增强

           程序报错,跑出异常了,一般的做法是打印到控制台或日志文件中,这样很多地方都得去处理,有没有一个一劳永逸的方法呢?那就是Throws Advice(抛出增强):

        从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


         跑出增强需要实现org.springframework.aop.ThrowsAdviceJ接口,在接口方法中可获取方法,参数目标对象,异常对象等信息。我们可以把这些信息统一写入日志中,也可以持久到数据库中。这个功能很溜。但是还有一个更厉害的增强。如果某个类实现了A接口,但没有实现B接口,那么该类可以调用B接口的方法吗?看看下面的内容:

         4,Spring AOP:引入增强

         以上提到的都是对方法的增强,那能否对类进行增强?用AOP的行话来说,对方法的增强叫Weaving(织入),而对类的增强叫Introduction(引入)。Introduction Advice(引入增强)就是对类的功能增强,它也是Spring AOP提供的最后一种增强。

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


       5,Spring AOP:切面

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


          6,Spring AOP:自动代理(扫描bean)

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介



        7,Spring AOP:自动代理(扫描切面配置)

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

       老罗的解决方案似乎已经掉进了切面类的深渊,这还真是所谓的“面向切面编程了”,最重要的是切面,最麻烦的也是切面。

      必须要把切面配置简化掉,spring才能有所突破。


      二:Spirng + AspectJ

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介

从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介


       这篇基本都是介绍AOP的知识,是我们要写框架的基础,但不是重点所以就截图“从零开始写javaweb”里面的代码了。