Spring之AOP
一、什么是AOP:
面向切面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。
AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。
二、AOP的存在价值:
AOP 专门用于处理系统中分布于各个模块中的交叉关注点的问题,在 Java EE 应用中,常常通过 AOP 来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP 已经成为一种非常常用的解决方案:
左图:有时候开发人员会在不同方法复制黏贴相同的代码段。这样要是修改代码段里头某部分,就要全部修改方法中的代码。
右图:将公共部分代码抽离出来,然后每个方法单独调用,这样无需改变每个方法的代码段,但是还是要修改每个方法。
而AOP的功能在于我无需修改每个方法里头,通过AOP代理去动态改变方法。
三、AOP的原理剖析
AOP 代理其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用,AOP 代理所包含的方法与目标对象的方法如下图所示:
四、AOP的关键概念
以下是官方文档所给出的AOP的关键概念的解释:
切面 - Aspect 类是对物体特征的抽象,切面就是对横切关注点的抽象
连接点 - Join Point 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
通知 - Advice 所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
切入点 - Point Cut 对连接点进行拦截的定义
引入 - Introduction 在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
目标对象 - Target Object 代理的目标对象
AOP代理 - AOP Proxy
织入 - Weaving 将切面应用到目标对象并导致代理对象创建的过程
五、AOP通俗的理解:
一个组件A,不关心其他常用的服务组件B,但是这个组件A使用组件B的时候,不是组件A自身去调用,而是通过配置等其他方式,比如Spring中可以通过xml配置文件。这样就使得A压根就不需要知道服务组件B是怎样的,爱存在不存在,爱怎么存在都与A无关。A只关心自己的业务逻辑,具体A使用B的时候,配置文件去做,与具体的A组件无关。
更多参考:http://www.cnblogs.com/hongwz/p/5764917.html