Spring AOP的基本认识

AOP(Aspect Oriented Programming):面向切面编程。

AOP的作用:实现业务逻辑层解耦,也就是将业务逻辑代码和系统服务代码(或者其他无关业务逻辑的代码)分离开。

先弄清业务逻辑代码和系统服务代码的区别吧
业务逻辑代码是根据产品,实现程序逻辑功能,进行数据处理的代码,写业务代码是大部分程序员大部分时间的工作(所以不少人憎恶长时间写业务代码,认为没有技术含量)。
系统服务代码是实现系统关注点的代码,例如日志记录,性能统计,安全控制,事务处理,异常处理等功能,

程序中很多时候需要在业务逻辑代码中调用系统级服务代码,它们属于不同模块,从软件工程所学知识来看,为了写出高质量程序,实现代码的复用性,低耦合是基本要求。

可能大家还是不太了解,为了理解以上概念,我们可以设想以下场景:
对于数据库的操作是程序中常用到的,软件实现查看信息,更改信息,删除信息等功能,底层都是对数据库的操作结果,我们通常在Dao类中编写对数据库的增删改查方法,大家都知道,数据库的数据是非常重要而敏感的,要保证数据库的安全性,稳定性,所以我们对操作数据库进行操作的时候必须要小心,特别是增、删、改操作,在调用操作方法时加入日志记录,事务处理等系统级功能是很有必要的,这样我们对数据库操作过程便有迹可循,如果进行了错误操作,或者出现不可预期的因素可以进行事务回滚,实现数据库的恢复,这样数据库的安全性就大大提高了(对数据库的重视程度再高也不为过,对于很多互联网公司而言,数据就是生命)。

下面举例说明,现在有一个数据库操作类,有对数据库进行增删改操作的三个方法。
这里写图片描述

这三个方法具有通用的业务逻辑,就是对数据库进行操作,为了对数据库进行安全监控,我们需要在对数据库操作之前都加入日志代码,如下:
这里写图片描述

从上图中可以明显看出,相同的记录日志代码在方法中重复了三次,为了提高代码的复用性,我们可以将记录日志的代码提取出来,单独写成一个记录日志的类,这样我们可以在save(),update(),delete()方法中直接引用记录日志类的方法就行。
这里写图片描述

我们通过面向对象的编程思想,将记录日志代码分离出来,增加了代码的复用性,让业务代码更加简洁,然而这样还不够,假想一下,现在数据库系统有了新要求,要求在对数据库进行增删改操作之后也记录日志表明操作成功,我们又得更改调用日志方法和操作代码的顺序,如果Dao操作类中不止三个方法,有成千上万个方法,我们就得重新更改成千上万次,出现这种问题的根源就是日志类和数据库操作类耦合度太高,在操作类方法中主动调用了日志类方法,是一种硬编程方式,将程序写死了,为了实现操作类随机调用日志类,让程序更加灵活,此时AOP的作用就展现出来了,使用AOP将两个类实现解耦,由此知道,OOP(面向对象编程)是AOP的基础。

我们先知道,AOP可以自动将日志类的方法添加进操作方法的任意位置,这个过程由AOP完成,不需要操作类方法主动调用日志类中的方法,那么AOP是怎样完成这个功能呢?

Spring的两个核心就是AOP和IOC,IOC是控制反转,简单来说就是讲创建对象来交给Spring容器管理(关于IOC的内容理解会另写一篇文章),也就是说如果我们需要使用一个类,不需要再使用new关键字去创建类对象了,整个过程交给Spring容器操作就行,这样我们同时使用IOC和AOP的法则,就能实现上述功能,实现解耦。

所以我们 使用Spring容器,将日志记录类对象和操作类对象全部交给Spring容器管理,就可以实现操作类中哪些方法可以调用日志记录类,以及在什么时机什么位置调用。

使用专业的AOP术语来定义以上提及的各个部分或者关键点。
这里写图片描述
红色字体就是SpringAOP体系结果中四要素。

对于这四要素的解释:

  1. 目标组件:具有通用业务逻辑的对象,业务处理的目标(对应上述数据库操作类)。
  2. 方面组件:统一处理程序中某一方面业务逻辑的工具类(对应上述日志类)。
  3. 切入点:一段配置,告诉Spring在哪些方法上调用方面组件。
  4. 通知:一段配置,告诉Spring在什么时机调用方面组件。

从这个概念上来讲,我们不用再区分业务逻辑代码和系统服务代码,对于数据库操作类而言,最核心的方法仅仅只是增删改查方法而已,只要调用相对应的一个方法就行,我们不需要再想着在什么时机调用其他的类,不管是系统级或者是其他业务逻辑代码,这些都交给AOP处理,这样最核心的业务代码简单明了,程序逻辑更加清晰,当然AOP还是得根据需求由我们自己配置。

为了加深对于SpringAOP的理解,也是从入门级了解AOP的使用,写一个简单的Demo实践一下吧,为了避免博文太长,写在另外一篇,讲解AOP通知类型及其使用。

启下:AOP的使用、通知类型介绍和AOP原理

猜你喜欢

转载自blog.csdn.net/superxiaolong123/article/details/79716563
今日推荐