AOP:面向切面编程,相对于OOP面向对象编程。

  存在即合理,任何东西的总有它存在的道理和意义。Spring 中AOP存在的意义在于解耦,功能模块间的解耦。在OOP中,如果我们想要在不同的类之间共享某个功能,我们会通过继承父类或者实现接口,但这样增加了代码的耦合程度,且Java中类只能单继承,这就阻碍了我们将更多了行为添加到一组类上,AOP弥补了OOP的不足。

  我们的程序是由许许多多的“关注点”组成的,有的关注点比较集中,有个关注点分散在程序各处。我们称分散在各处的关注点为横向关注点。常见的横向关注点有安全、事务、日志。

  散落在各处的关注点会使我们的代码变得混乱。这让我想起了曾经参与开发的某个项目,在开发进行了一段时间后,客户提出需要增加一个系统日志功能,然后负责实现系统日志功能的同事使用一函数实现了该功能,所有需要记录日志的操作都需要调用该函数......

  将关注点分散到多个组件中去,将会给你的代码带来双重的复杂度:

  1.实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑,必须修改各个模块中的相关实现。即使你把关注点抽象成一个独立的模块,其他模块只是调用它的方法,但方法的调用还是会重复再各个模块中。

  2.组件因为那些与核心业务无关的代码变得混乱。

  AOP能够帮助我们将分散在各处的横向关注点抽离出来形成可重用的组件,并且以声明的方式将它们应用到需要影响的组件中去。最终这些组件将会具有更高的内聚性且能够关注于自身业务。我们称实现横向关注点的组件为切面

 

 

 

 

  如上图所示,我们可以把切面想象成覆盖在很多组件外的一个壳,借助AOP我们能使用各种功能层去包裹核心业务层,核心业务层不需要知道功能层的存在。