欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring AOP 面向切面

程序员文章站 2022-07-12 14:11:29
...


一、什么是横切关注点

在软件开发中,散布于应用中的多处功能被称为横切关注点(cross-cutting concern)

spring AOP 面向切面

在软件开发中,散布于应用中的多处功能被称为横切关注点(cross-cutting concern)

通常来讲横切关注点从概念上是与应用程序的核心业务逻辑相分离的,但是我们目前在开发的过程中往往将他们直接嵌入到业务逻辑中。
把横切关注点和业务逻辑相分离正是面向切面编程(AOP)所要解决的问题。
在软件开发中,散布于应用中的多处功能被称为横切关注点(cross-cutting concern)

二、重用通用功能最常见的解决方案

将横切关注点抽离出来的最常用的解决方案包括继承、委托和面向切面等方式

1.在软件开发中,散布于应用中的多处功能被称为横切关注点(cross-cutting concern)


1)继承:应用程序体系复杂

class A{
  void method1(){

  }
}
class B{
  void method2(){

  }
}
class C{
}

类C想有类A、B里面的方法那么java中不能有多继承


2)委托:需要创建代理对象,编码复杂

代理就是用代理的方法chansheng代理对象

3)切面:切面提供了取代继承和委托的另一种可选方案,更清晰简洁。增加功能的同时无需修改受影响的业务代码。

那么我们就可以通过切面编程实现一些复杂的开发

三、什么是面向切面


AOP:Aspect Oriented Programming
切面能帮助我们将横切关注点模块化,可以对业务逻辑的各个部分进行隔离,使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,提高开发效率。

定义AOP 术语
大多数AOP术语并不直观,但是进入这个领域之前我们必须了解这些概念:

  • Target(目标对象):代理的目标对象

  • Proxy(代理):一个类被 AOP 增强后,就产生一个代理类

  • Advice(通知/增强):切面要完成的工作就是通知。通知中应该定义做什么何时候做(做什么:计算电费,什么时候做:每月 每月的月初,月中还是月末,有一个具体的时间点)
    • Spring切面可以应用5种类型的通知:
  • 前置通知(Before):在目标方法被调用之前调用通知功能;
  • 后置通知(After):在目标方法调用之后调用通知,此时不会关心方法的输出是什么(无论是否发生异常);
  • 返回通知(After-returning):在目标方法成功执行之后调用通知;
  • 异常通知(After-throwing):在目标方法抛出异常后调用通知;
  • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

  • Join point(连接点):每家的电表是抄表员计算电费的目标,要计算电费就首先要寻找电表,那么电表就是计算电费这个通知的连接点。所以连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。

  • Pointcut(切点):一个抄表员不可能访问所有的住户,电力公司为每一个抄表员都分别指定某一块区域的住户。类似的一个切面不需要通知所有的连接点。定义切点有助于缩小连接点的范围,例如我们只需要在service层添加事务,并不需要在dao层和web层添加事务。


  • Aspect(切面):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——做什么,在何时,在何处

  • Weaving织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:
    • 编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
    • 类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ 5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。
    • 运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。(动态代理   spring aop是在运行期动态织入的)

  • Introduction(引入):引入允许我们向现有的类添加新方法或属性。例如,我们可以创建一个Log通知类,该类记录了对象最后一次修改时的状态。这很简单,只需一个方法,setLastModified(Date),和一个实例变量来保存这个状态。然后,这个新方法和实例变量就可以被引入到现有的类中,从而可以在无需修改这些现有的类的情况下,让它们具有新的行为和状态

在软件开发中,散布于应用中的多处功能被称为横切关注点(cross-cutting concern)