Spring学习笔记 什么是AOP

AOP, 全称Aspect oriented programming,经常被翻译成面向切面编程或者面向方面编程。很多人开始的时候会产生一个问题,AOP(面向切面编程)与OOP(面向对象编程)的区别是什么。其实AOP与OOP可以理解为不在同一层面上的两个独立的定义。也就是说其实这两个东西没法去做一个对等的比较,OOP专注于对象,我们利用对象的属性,行为来解决现实中的问题,而AOP则用来在使用OOP解决问题的过程中增强解决问题的能力,实现更好的模块化。

 

什么是切面?

切面可以理解为我们程序中许多并无关联的对象、子程序所共同拥有的需要关注的方面,通常遍布于整个程序中,比如我们需要在许多代码逻辑中增加安全性保障的代码(大部分这些代码都是相同的),比如在执行一个方法前后要进行日志记录,比如在执行方法时要实现事务,保证操作的原子性等等。这些一个共同点就是我们程序中需要关注的但是与实际业务逻辑无关。在利用AOP以前,它分散于整个程序中并混杂在业务逻辑代码中,假如对于安全性考虑需要变更安全性相关代码,则需要改动大量原先混杂在业务逻辑中的安全性处理代码。类似这种需要考虑的方面我们叫他切面,也就是Aspect。

 

AOP能做什么?

AOP可以从增强模块化以及降低切面与业务逻辑的耦合度来增强OOP程序。使用AOP可以为需要某些特定功能的对象集合增加功能而不必修改这些对象的类代码。也就是我们将与实际业务逻辑无关但是需要关注的部分提取出来通过AOP来动态的添加到业务逻辑代码中。即使这些Aspect的实现机制以及代码进行了修改,只需改动一处而不会影响原有业务逻辑代码。

 

Spring中的AOP

与同样实现AOP的AspectJ不同,AspectJ将附加功能加入到目标对象中进行编译,Spring中附加功能与目标对象是分开的,在runtime时动态增加到目标对象中。这通常是通过Proxy实现的(可以看看设计模式中的代理模式,Spring的AOP就是基于Proxy实现的)。也因为Spring没有将附加功能与目标对象混合后编译所以Spring的在为对象增加附加功能只能实现在method(方法)的级别。相当于只能在执行某个method前或之后增加特定功能,而无法在方法体内部截断并增加功能。Spring通过配置文件来随时对一系列特定的对象增加、修改或取消特定功能而使程序不受其影响,也就是说这一系列对象即使没有通过Spring的AOP增加应用的功能时也是可以正常运行的。可以理解为这一系列对象根本不知道自己是否通过AOP被增加了某些功能。

posted @ 2016-03-28 15:36 liujufu 阅读(...) 评论(...) 编辑 收藏