认识Spring AOP面向切面编程

目录

一、面向切面编程思维(AOP)

二、AOP思想主要的应用场景

三、AOP术语名词介绍

四、Spring AOP框架介绍和关系梳理


一、面向切面编程思维(AOP)

AOP:Aspect Oriented Programming面向切面编程

        AOP可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

        AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

OOP(面对对象编程)对OOP纵向编程的理解:

认识Spring AOP面向切面编程_第1张图片

  1. 通过继承实现方法的调用,子类能够使用父类方法,这种就是垂直的、纵向的编程。
  2. 弊端:不能实现局部修改,由于子类对父类的方法只有两种操作模式,一种是完全继承父类方法,一种是完全重写父类的方法。这也就意味着,如果想要在所有方法中都增加同一个功能,就需要手动在所有方法中逐一添加对应功能的代码。这样会导致代码冗余和维护困难。

 AOP(面对切面编程)对AOP切面编程的理解

认识Spring AOP面向切面编程_第2张图片

  1. 可以将非核心业务代码横向插入到业务代码中。这就是面对切面编程。最关键的操作就是冗余代码的提取与插入。
  2. AOP解决核心问题:解决非核心业务代码冗余问题。

AOP与动态代理

  1. AOP面对对象编程的核心:面对对象编程是对动态代理的简化,动态代理在原本Java中有两种实现方法一种是JDK模式,一种是cglib模式,但是两种模式的实现都十分复杂。
  2. 为什么要实现动态代理类呢?因为传统的OOP(面向对象编程)有许多的的缺点,例如在一个实现计算的接口的输出,需要用到大量的非业务的操作,比如输出传入参数值的信息,输出结果信息。而每一个方法都需要有这些非业务的操作,所以为了解耦,将非业务和核心业务进行分离,就需要用到动态代理来实现。

二、AOP思想主要的应用场景

AOP(面向切面编程)是一种编程范式,它通过将通用的横切关注点(如日志、事务、权限控制等)与业务逻辑分离,使得代码更加清晰、简洁、易于维护。AOP可以应用于各种场景,以下是一些常见的AOP应用场景:

  1. 日志记录:在系统中记录日志是非常重要的,可以使用AOP来实现日志记录的功能,可以在方法执行前、执行后或异常抛出时记录日志。
  2. 事务处理:在数据库操作中使用事务可以保证数据的一致性,可以使用AOP来实现事务处理的功能,可以在方法开始前开启事务,在方法执行完毕后提交或回滚事务。
  3. 安全控制:在系统中包含某些需要安全控制的操作,如登录、修改密码、授权等,可以使用AOP来实现安全控制的功能。可以在方法执行前进行权限判断,如果用户没有权限,则抛出异常或转向到错误页面,以防止未经授权的访问。
  4. 性能监控:在系统运行过程中,有时需要对某些方法的性能进行监控,以找到系统的瓶颈并进行优化。可以使用AOP来实现性能监控的功能,可以在方法执行前记录时间戳,在方法执行完毕后计算方法执行时间并输出到日志中。
  5. 异常处理:系统中可能出现各种异常情况,如空指针异常、数据库连接异常等,可以使用AOP来实现异常处理的功能,在方法执行过程中,如果出现异常,则进行异常处理(如记录日志、发送邮件等)。
  6. 缓存控制:在系统中有些数据可以缓存起来以提高访问速度,可以使用AOP来实现缓存控制的功能,可以在方法执行前查询缓存中是否有数据,如果有则返回,否则执行方法并将方法返回值存入缓存中。
  7. 动态代理:AOP的实现方式之一是通过动态代理,可以代理某个类的所有方法,用于实现各种功能。 综上所述,AOP可以应用于各种场景,它的作用是将通用的横切关注点与业务逻辑分离,使得代码更加清晰、简洁、易于维护。

三、AOP术语名词介绍

1-横切关注点

从每个方法中抽取出来的同一类非核心业务。在同一个项目中,我们可以使用多个横切关注点对相关方法进行多个不同方面的增强。

这个概念不是语法层面天然存在的,而是根据附加功能的逻辑上的需要:有十个附加功能,就有十个横切关注点。

认识Spring AOP面向切面编程_第3张图片

2-通知(增强)

每一个横切关注点上要做的事情都需要写一个方法来实现,这样的方法就叫通知方法。

  • 前置通知:在被代理的目标方法前执行
  • 返回通知:在被代理的目标方法成功结束后执行(寿终正寝
  • 异常通知:在被代理的目标方法异常结束后执行(死于非命
  • 后置通知:在被代理的目标方法最终结束后执行(盖棺定论
  • 环绕通知:使用try...catch...finally结构围绕整个被代理的目标方法,包括上面四种通知对应的所有位置

认识Spring AOP面向切面编程_第4张图片

3-连接点 joinpoint

这也是一个纯逻辑概念,不是语法定义的。

指那些被拦截到的点。在 Spring 中,可以被动态代理拦截目标类的方法。

4-切入点 pointcut

定位连接点的方式,或者可以理解成被选中的连接点!

是一个表达式,比如execution(* com.spring.service.impl..(..))。符合条件的每个方法都是一个具体的连接点。

5-切面 aspect

切入点和通知的结合。是一个类。

认识Spring AOP面向切面编程_第5张图片

6-目标 target

被代理的目标对象。

7-代理 proxy

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

8-织入 weave

指把通知应用到目标上,生成代理对象的过程。可以在编译期织入,也可以在运行期织入,Spring采用后者。

认识Spring AOP面向切面编程_第6张图片


四、Spring AOP框架介绍和关系梳理

  1. AOP一种区别于OOP的编程思维,用来完善和解决OOP的非核心代码冗余和不方便统一维护问题!
  2. 代理技术(动态代理|静态代理)是实现AOP思维编程的具体技术,但是自己使用动态代理实现代码比较繁琐!
  3. Spring AOP框架,基于AOP编程思维,封装动态代理技术,简化动态代理技术实现的框架!SpringAOP内部帮助我们实现动态代理,我们只需写少量的配置,指定生效范围即可,即可完成面向切面思维编程的实现!

认识Spring AOP面向切面编程_第7张图片


本章重点总结:

1.面向切面编程思维(AOP)

        加深对OOP面向对象编程和AOP面对切面编程的理解

2.AOP术语名词介绍

        熟悉AOP术语 横切关注点、通知(增强)、目标、连接点、切点、切面、织入、代理

3.Spring AOP框架介绍和关系梳理

        知道核心问题、AOP思维、代理技术、AOP框架之间的关系

你可能感兴趣的:(SSM框架,SpringBoot,spring,架构,java,开发语言)