AOP

1Spring AOP 简介

1.1AOP 概述

1.1.1AOP 是什么?

AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程(OOP)的一种补充和完善。它以通过预编译方式和运行期动态代理方式,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。如图- 1 所示:

图-1
AOP 与 OOP 字面意思相近,但其实两者完全是面向不同领域的设计思想。实际项目中我们通常将面向对象理解为一个静态过程(例如一个系统有多少个模块,一个模块有哪些对象,对象有哪些属性),面向切面的运行期代理方式,理解为一个动态过程,可以在对象运行时动态织入一些扩展功能或控制对象执行。

1.1.2AOP 应用场景分析?

实际项目中通常会将系统分为两大部分,一部分是核心业务,一部分是非核业务。在编程实现时我们首先要完成的是核心业务的实现,非核心业务一般是通过特定方式切入到系统中,这种特定方式一般就是借助 AOP 进行实现。

AOP 就是要基于 OCP(开闭原则),在不改变原有系统核心业务代码的基础上动态添加一些扩展功能并可以"控制"对象的执行。例如 AOP 应用于项目中的日志处理,事务处理, 权限处理,缓存处理等等。如图-2 所示:

图-2
思考:现有一业务,在没有 AOP 编程时,如何基于 OCP 原则实现功能扩展?

1.1.3Spring AOP 应用原理分析(先了解)?

Spring AOP 底层基于代理机制(动态方式)实现功能扩展:

1)假如目标对象(被代理对象)实现接口,则底层可以采用 JDK 动态代理机制为目标对象创建代理对象(目标类和代理类会实现共同接口)。
2)假如目标对象(被代理对象)没有实现接口,则底层可以采用 CGLIB 代理机制为目标对象创建代理对象(默认创建的代理类会继承目标对象类型)。
Spring AOP 原理分析,如图-3 所示:

图-3
说明:Spring boot2.x 中 AOP 现在默认使用的 CGLIB 代理,假如需要使用 JDK 动态代理可以在配置文件(applicatiion.properties)中进行如下配置:

1.2Spring 中 AOP 相关术语分析

▪切面(aspect): 横切面对象,一般为一个具体类对象(可以借助@Aspect 声明)。
▪通知(Advice): 在 切面的 某个特 定连接 点上执行 的动作 ( 扩展功 能) , 例如around,before,after 等。
▪连接点(joinpoint):程序执行过程中某个特定的点,一般指向被拦截到的目标方法。
▪切入点(pointcut):对多个连接点(Joinpoint)一种定义,一般可以理解为多个连接点的集合。
连接点与切入点定义如图-4 所示:

图-4
说明:我们可以简单的将机场的一个安检口理解为连接点,多个安检口为切入点,安全检查过程看成是通知。总之,概念很晦涩难懂,多做例子,做完就会清晰。先可以按白话去理解。

2Spring AOP 快速实践

2.1业务描述

基于项目中的核心业务,添加简单的日志操作,借助 SLF4J 日志 API 输出目标方法的执行时长。(前提,不能修改目标方法代码-遵循 OCP 原则)

2.2项目创建及配置

创建 maven 项目或在已有项目基础上添加 AOP 启动依赖:

说明:基于此依赖spring 可以整合AspectJ 框架快速完成AOP 的基本实现。AspectJ 是一个面向切面的框架,他定义了 AOP 的一些语法,有一个专门的字节码生成器来生成遵守 java 规范的 class 文件。

2.3扩展业务分析及实现

2.3.1创建日志切面类对象

将此日志切面类作为核心业务增强(一个横切面对象)类,用于输出业务执行时长, 其关键代码如下:

说明:

▪@Aspect 注解用于标识或者描述 AOP 中的切面类型,基于切面类型构建的对象用于为目标对象进行功能扩展或控制目标对象的执行。
▪@Pointcut 注解用于描述切面中的方法,并定义切面中的切入点(基于特定表达式的方式进行描述),在本案例中切入点表达式用的是 bean 表达式,这个表达式以 bean 开头,bean 括号中的内容为一个 spring 管理的某个bean 对象的名字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值