AOP概述

AOP概述

  • Aspect Orieted Programming ,中文叫“面向切面编程”或“面向方面编程”
  • 是一种编程模式,将分布在多个类中的功能封装到一个类中,这些功能称为cross-cutting concerns(横切关注点),如日志、事务、缓存权限、安全等
  • 不是替代OOP,而是对其的补充

图1

  • 上面这张图看起来,好像挺复杂。如果从横线的角度来看的话,这里有若干个软件核心的业务模块。假如将上图当成是一个电商系统,三个竖方向是处理商品的、处理订单的、处理用户的三个模块。这些模块中都有相同的功能,比如对权限的管理、对日志的记录、事务的控制。

  • 它们是分布在各个业务之间,可能都是一些相同的处理逻辑,那么这种情况感觉使用面向对象的方式也可以解决,但是从设计的角度来说,这种模块和业务模块之间是没有关系的。比如业务模块不应该跟权限模块密切相关,如果使用面向对象的里面的设计,很容易想到使用继承,但是一个特定的业务模块跟权限、日志、事务这样的功能并不是继承关系。

  • 如果使用AOP的方式来编程的话,情况就不一样。我们可以将三个权限、日志、事务这几个模块提取出来,在写业务模块的时候并不考虑这些横切的关注点,我们只需要实现主流的业务就可以。

  • 我们通过某种方式,将横切关注点加到核心业务模块的执行过程里面,这种方式实际上就是AOP的编程模式。

AOP的优点

  • 减少了大量的代码重复
    从上图来看,一个业务模块里面都有类似的功能,比如权限判断的代码很多都是类似的,再比如跟数据库打交道控制事务的代码也是非常的重复,通过面向切面编程,我们并不需要重复的编写这些逻辑,我们单独把它们提取到一个类中就可以了,这样对于维护上来说也是相当方便的。

  • 功能组件之间的解耦
    假如将上图的横切关注点封装成一个类,里面提供若干的方法,在每个模块里面需要用的话,直接使用方法调用,那么这样也还会有耦合。
    如果使用AOP的话,可以将核心业务模块的功能和横切关注点的功能完全分开,这样在代码层面是毫无关联的。并且解耦后,程序的灵活性也能得到极大的提升。

AOP的框架

  • AspectJ
    功能非常强大,已经发展成为业界的标准,包括Spring也会支持AspectJ。
    AspectJ伴随着功能强大,使用上也会比较复杂点,因为它提供了一种非Java的语法来编写代码。如果要掌握AspectJ,还要学习它的一些基本语法。
  • Spring
    学习起来比AspectJ比较简单一些,而且它编程风格和Java是完全一致的。绝大部分使用Spring的AOP功能,就能够很好的满足我们的需求。
  • Aspectwerkz
    用起来也比较简单
  • JBoss AOP
    是JBoss提供的

AOP的类型

  • 静态AOP
    • 修改应用程序的字节码,必要时会改变与扩展应用程序代码
    • 性能好,但是改动了切面需要重新编译整个应用程序
    • AspectJ提供了实现
  • 动态AOP
    • 实现过程是在运行时动态执行
    • 性能稍差,但是改动了切面无需重新编译整个应用程序
    • Spring使用代理机制实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值