Spring_AOP(面向切面编程)

说完Spring的IOC后下面来说说另外一个核心AOP吧。

AOP概念

  AOP通俗的讲减少重复代码,少写代码达到相同的目的。面向切面编程(AOP, Aspect Oriented Programming)就是一种减重复代码方式。是基于横向抽取机制,而传统 OOP(Object-Oriented Programming,面向对象编程)是基于纵向继承机制,在java中将一个个功能模块抽象成一个个对象。这些对象通过一定的联系完成我们所看到的一个个应用,一个个服务。它的核心就是对象(Object)。而面向切面的核心当然是切面了。

  那我们举个例子说明一下什么是切面,比如说:炒菜,锅与炉子共同来完成炒菜,锅与炉子就是切面。web层级设计中,web层->网关层->服务层->数据层,每一层之间也是一个切面。编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面。

具体化实例:

我们一般在京东购物时,需要去购物车结算、以及查看个人信息时都需要登录,
按照这样的思路。,我们一般会用以下流程:

Spring_AOP(面向切面编程)_第1张图片

  有个问题是有多少接口,就要将相同代码复制过去。所以提出一个公共方法,每个接口都来调用这个接口。这里有点切面的味道了。
Spring_AOP(面向切面编程)_第2张图片
  同样有个问题,虽然每次不用那么辛苦,但每个接口总得要调用这个方法。于是就有了切面的概念,将方法注入到接口调用的某个地方(切点),如下图:

Spring_AOP(面向切面编程)_第3张图片
这样接口只需要关心具体的业务,而不需要关注其他非该接口关注的逻辑或处理。

而红框处,就是面向切面编程。

AOP的实现原理是基于动态代理模式,关于动态代理模式会在Java设计模式中写到。

那么AOP的好处有什么呢?也就是横向抽取机制:

① 每个事物逻辑位于一个位置,代码不分散,便于维护和升级
② 业务模块更简洁,只包含核心业务代码。

接下来看看一个关于计算类中的四个方法与AOP的结合:

Spring_AOP(面向切面编程)_第4张图片

是不是对上面的有点关键字不了解?那下面来看一下。

横切关注点:从每个方法中抽取出来的同一类非核心业务。

切面(Aspect):封装横切关注点信息的类,每个关注点体现为一个通知方法。

通知(Advice):切面必须要完成的各个具体工作。spring支持5种方法上的通知类型(Spring使用AspectJ注解来声明通知方法):

注解 通知
@After 通知方法会在目标方法返回或抛出 异常后调用
@AfterReturning 通知方法会在目标方法返回后调用
@AfterThrowing 通知方法会在目标方法抛出异常后调用
@Around 通知方法会将目标方法封装起来
@Before 通知方法还在目标方法调用之前执行

目标(Target):被通知的对象。

代理(Proxy):向目标对象应用通知之后创建的代理对象。

连接点(Joinpoint):横切关注点在程序代码中的具体体现,对应程序执行的某个特定位置。例如:类某个方法调用前、调用后、方法捕获到异常后等。
在应用程序中可以使用横纵两个坐标来定位一个具体的连接点:
Spring_AOP(面向切面编程)_第5张图片
切入点(pointcut):定位连接点的方式。每个类的方法中都包含多个连接点,所以连接点是类中客观存在的事物。如果把连接点看作数据库中的记录,那么切入点就是查询条件——AOP可以通过切入点定位到特定的连接点。切点通过org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。

切入点表达式 :通过表达式的方式定位一个或多个具体的连接点。
切入点表达式的语法格式:

execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表]))

切入点表达式应用到实际的切面类中:
Spring_AOP(面向切面编程)_第6张图片

你可能感兴趣的:(#,SSM框架)