天天看点

约定编程SpringAOP-AOP的概念

通过上面约定编程的例子,可以看到,只要按照一定的规则,我们就可以将你的代码织入事先约定好的流程中。实际上Spring AOP也是一种约定流程的编程,在Spring 中可以使用多中方式配置AOP,因为Spring Boot采用注解的方式,所以为了保持一致,这里就只是介绍@Aspectj注解的方式,不过在开启AOP术语的时候,我们先考虑为什么使用AOP.

1. 为什么使用AOP

AOP最为典型的应用实际就是数据库事务的管控。例如,当我们需要保存一个用户时,可能需要连同他的角色信息一同保存到数据库中。于是可以看到如下图所示的流程图。

约定编程SpringAOP-AOP的概念

这里的用户信息和用户角色信息,我们都可以使用面向对象编程(OOP)进行设计码,但是他们在数据库事务中的要求是,要么一起成功,要么一起失败,这样OOP就无能为力了。数据库事务毫无疑问是企业级应用关注的核心问题之一,而使用AOP可以解决这些问题。

AOP还可以减少大量重复的工作。在Spring流行之前,我们可以使用JDBC代码实现很多的数据库工作,例如。插入一个用户信息。我们可以用JDBC代码来实现。

我们先描述一下流程:

  • 打开数据库链接,然后对其属性进行设置
  • 执行SQL语句
  • 如果没有异常提交事务
  • 如果发生异常则回滚事务
  • 关闭数据库事务连接

这个流程可以使用如下流程图描述:

约定编程SpringAOP-AOP的概念

这张图与约定编程的图不太一样,但是还是接近的。如果我们通过约定编程设计如图,你也许会更感兴趣

约定编程SpringAOP-AOP的概念

从图中可以看到,丛数据库的打开,关闭以及事务的提交回滚都有默认的流程给你实现。换句话说,你不需要完成他们,你需要得任务是编写SQL这一步而已,然后织入流程中。我们可以使用Spring AOP处理一些无法使用OOP实现的业务逻辑。其次通过约定,可以将一些业务逻辑织入流程中,并且可以将一些通用的逻辑抽取出来,然后给予默认实现,这样你只需要完成部分的功能就可以了,这样可以使的开发者的代码更加简洁,同时,可维护性也得到提高。在后面数据库事务和Redis开发的章节中,我们还会再次看到他的威力。

2. AOP术语和流程

上面的内容已经介绍约定编程和为什么使用AOP,接下来是时候介绍AOP的术语和流程了,相信有了约定编程的概念之后AOP的概念也会更加容易理解。不过,Spring AOP是一种基于方法的AOP,他只能应用在方法上。

下面我们来讲解AOP的术语:

- 连接点(join point):对应的是具体拦截的对象,因为Spring只支持方法,所以被拦截的对象往往就是值特定的方法。例如我们前面提到的HelloServiceInpl的Hello方法就是一个连接点,AOP将会通过动态代理技术把它织入对应的流程中。

- 切点(point cut):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则表达式或者指示器的规则去定义,从而适配连接点。切点就是提供这样一个功能的概念。

- 通知(advice):就是按照约定流程下的方法,分为前置通知(before advice),后置通知(after advice),环绕通知(around advice),事后返回通知(afterReturning advice)和异常通知(afterThrowing advice),他会根据约定织入流程中,需要弄明白他们在约定中的顺序和运行的条件。

- 目标对象(target):即被代理对象,例如约定编程中的HelloServiceImpl实例就是一个目标对象,他被代理了。

- 引入(introduction):是指引入新的类和其他方法,增强现有Bean的功能。

- 织入(weaving):他是通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并且按照约定将各类通知织入约定流程的过程。

-切面(aspect):是一个可以定义切点,各类通知和引入的内容。Spring AOP将通过他的信息来增强Bean的功能或者将对应的方法织入流程。 显然上面的描述还是比较抽象的,如图所示是对其进一步的说明。

约定编程SpringAOP-AOP的概念