初识 AOP

1、概念

AOP:Aspect Oriented Programming 面向切面编程,其代码实质,即代理模式的应用

面向对象编程面向接口编程面向切面编程
简化代码:把重复代码纵向抽取到父类解耦:不同组件之间解耦简化代码:把方法中的重复代码横向抽取到切面中

2、为什么要学 AOP?

① 事务操作的基本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {

// 开启事务

// 核心目标操作代码

// 目标操作成功结束:提交事务

}catch(Exception e){

// 目标操作异常结束:回滚事务

}finally{

// 目标操作最终结束:释放资源

}

② 规律

『事务操作』围绕着『核心目标操作』展开,不管『核心目标操作』如何变化,『事务操作』都是同一套代码,所以『事务操作』部分的代码可以抽取出来——即哪里有需要,就往哪里套

③ 套路代码特征的进一步提取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {

// 目标操作前:特定操作『事务操作』

// 核心操作目标代码

// 目标操作成功结束:特定操作『事务操作』

}catch(Exception e){

// 目标操作异常结束:特定操作『事务操作』

}finally{

// 目标操作最终结束:特定操作『事务操作』

}

④ 结论

AOP 技术的作用:把『围绕』着目标代码的固定代码『抽取』出来,『封装』成固定的解决方案,哪里有需要,就往哪里套

3、AOP 技术的三要素

  • 抽取
  • 封装
  • 套用

4、面向对象和面向切面对比

① 相同点

都可以简化代码

② 区别

面向对象:纵向抽取

面向切面:横向抽取

5、AOP 的作用

简化代码:如果在项目中,有一系列方法都包含相同的、重复的代码,使用 AOP 就可以将这些代码抽取出来,从而实现代码的简化。

或者说:

代码增强:使用抽取出来、封装好的代理类去“套用”到目标方法上,就是对目标方法的代码增强

举例说明

① 原始代码

② 附加功能

这样附加功能后,代码存在明显的问题:

  • 代码会变得非常臃肿
  • 核心逻辑的代码和非核心逻辑的代码混杂在一起,不利于开发和维护
  • 将来不管是核心代码还是非核心代码想要升级或调试 bug,都非常不便

③ 抽取重复逻辑,简化代码

抽取出来之后,代理类中的非核心逻辑和目标类中的核心逻辑彼此分开,互不干扰。各自都可以独立进行升级、调试、维护。