SpringAOP(面向切面编程)

开课吧开课吧锤锤2021-08-10 11:09

AOP的全称是“AspectOrientedProgramming”,即面向切面编程,和OOP(面向对象编程)类似,也是一种编程思想。  

SpringAOP(面向切面编程)

AOP采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。  

简单的说,AOP的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。AOP就是代理模式的典型应用。  

目前最流行的AOP框架有两个,分别为SpringAOP和AspectJ。  

SpringAOP是基于AOP编程模式的一个框架,它能够有效的减少系统间的重复代码,达到松耦合的目的。SpringAOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类植入增强的代码。有两种实现方式:基于接口的JDK动态代理和基于继承的CGLIB动态代理。  

AspectJ是一个基于Java语言的AOP框架,从Spring2.0开始,SpringAOP引入了对AspectJ的支持。AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的植入。  

为什么使用AOP  

AOP提供了一种可插入的方式,可以在实际逻辑之前、之后或周围添加其它关注点。比如一个类中有以下10个方法。  

class A{ 
    public void m1(){...} 
    public void m2(){...} 
    public void m3(){...} 
    public void m4(){...} 
    public void m5(){...} 
    public void n1(){...} 
    public void n2(){...} 
    public void p1(){...} 
    public void p2(){...} 
    public void p3(){...} 
}  

 

在不使用AOP的情况下,我们必须修改以m开头的5种方法,在方法中调用发送通知的方法。  m开头的方法有5种,以n开头的方法有2种,以p开头的方法有3种。现在要求在以m开头的方法后添加发送通知功能。  

如果使用AOP,我们不用在方法内调用发送通知的方法,只需要在类的方法中定义切入点,然后在XML文件中调用。如果需要删除或修改此功能,那么只需要在XML文件中进行更改。由此可以看出,使用AOP可以增强代码的可维护性。  

AOP术语  

为了更好地理解AOP,我们需要了解一些它的相关术语。这些专业术语并不是Spring特有的,有些也同样适用于其它AOP框架,如AspectJ。它们的含义如下表所示。  

名称 说明
Joinpoint(连接点) 指那些被拦截到的点,在 Spring 中,指可以被动态代理拦截目标类的方法。
Pointcut(切入点) 指要对哪些 Joinpoint 进行拦截,即被拦截的连接点。
Advice(通知) 指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容。
Target(目标) 指代理的目标对象。
Weaving(植入) 指把增强代码应用到目标上,生成代理对象的过程。
Proxy(代理) 指生成的代理对象。
Aspect(切面) 切入点和通知的结合。

Advice直译为通知,也有的资料翻译为“增强处理”,共有5种类型,如下表所示。  

通知 说明
before(前置通知) 通知方法在目标方法调用之前执行
after(后置通知) 通知方法在目标方法返回或异常后调用
after-returning(返回后通知) 通知方法会在目标方法返回后调用
after-throwing(抛出异常通知) 通知方法会在目标方法抛出异常后调用
around(环绕通知) 通知方法会将目标方法封装起来

AOP是Spring的核心之一,在Spring中经常会使用AOP来简化编程。在Spring框架中使用AOP主要有以下优势。  

提供声明式企业服务,特别是作为EJB声明式服务的替代品。最重要的是,这种服务是声明式事务管理。  

允许用户实现自定义切面。在某些不适合用OOP编程的场景中,采用AOP来补充。  

可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时也提高了开发效率。  

以上就是开课吧广场小编为大家整理发布的“SpringAOP(面向切面编程)”一文,更多Java教程相关内容尽在开课吧广场Java教程频道!

SpringCGLlB动态代理

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享