Spring AOP 源码解析系列,建议你们按顺序阅读,欢迎讨论java
AOP中文翻译为面向方面编程或面向切面编程,维基百科对它的解释是编程
AOP指一种程序设计范型,该范型以一种称为aspect(切面)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。设计模式
谈到模块化机制,天然会想到OOP(面向对象编程)。OOP也是一种模块化的方法,它将数据和处理方法组合在一块儿,摆脱了函数式中数据杂乱无章的场景,使得程序的功能整齐且清晰,而且经过设计类的继承关系让代码得以重用,进一步提升开发效率。以后出现的多种设计模式使得程序设计更加便捷方便。api
然而世界是复杂的,尽管OOP已经可以解决大部分的问题,仍是存在一些非强业务相关的通用功能,明明你们都须要,一旦要归类却发现很复杂,每每最后写出来一个工具类。这些功能就如同城市中的水电交通通常,渗透到家家户户中,却不能交由每家每户本身来维护。这些功能就像城市的一个个切面,须要一个统筹管理的方式。这个就是AOP造成的缘由。服务器
而什么叫横切关注点?先解释下关注点,就是对软件工程有意义的小的,可管理的可描述的软件组成部分。太拗口了对不对,个人理解就是一个操做一个方法都是对一个关注点的实现,好比插入订单,扣减库存,记录日志等等。而有些关注点是软件的核心功能,称为主关注点,好比插入订单,有些关注点则弥散在软件内部,好比记录日志,这些关注点同许多不一样的主关注点都有交集,称为横切关注点。主关注点大都经过OOP的方式去设计更加清晰,而从主关注点中分离出横切关注点则就是面向切面的程序设计的核心概念。架构
分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中再也不含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系经过切面来封装、维护,这样本来分散在整个应用程序中的变更就能够很好的管理起来。框架
维基百科中对面向切面编程的操做方式给了很专业的解说。而当前已经出现了AOP的特定实现或AOP相关技术,好比模块化
同时有一个AOP联盟对AOP作了一个抽象和规范,造成了一个三层的表明性架构,以及一个通用的AOP API,这个API就是常用的aopalliance-api-1.0.jar。它定义了AOP的几个通用接口:函数
而对于加强(Advice),一般又分为如下几种类型工具
在AOP框架的实现上,在Spring以前已经已有不少,但Spring作出了一些独特的创新。
而Spring AOP在实现过程当中,对Aop联盟定义的API进行了扩展和加强。
而对于AOP的具体实现,Spring AOP默认使用JDK的动态代理来代理接口。而对于没有实现接口的类,或非接口中的方法,则经过CGLIB来实现代理。经过Advisor封装Advice和Pointcut并初始化成拦截器链,当方法调用请求时,匹配其所围绕的全部Advisor,而后按顺序执行,从而达到面向切面编程的核心,分离出横切关注点进行统一配置与管理。具体的实现方式将在以后的章节里详细介绍。