Spring源码-AOP(二)-AOP概念

Spring AOP 源码解析系列,建议你们按顺序阅读,欢迎讨论java

  1. Spring源码-AOP(一)-代理模式
  2. Spring源码-AOP(二)-AOP概念
  3. Spring源码-AOP(三)-Spring AOP的四种实现
  4. Spring源码-AOP(四)-ProxyFactory
  5. Spring源码-AOP(五)-ProxyFactoryBean
  6. Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator
  7. Spring源码-AOP(七)-整合AspectJ

1.AOP概念

AOP中文翻译为面向方面编程或面向切面编程,维基百科对它的解释是编程

AOP指一种程序设计范型,该范型以一种称为aspect(切面)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。设计模式

谈到模块化机制,天然会想到OOP(面向对象编程)。OOP也是一种模块化的方法,它将数据和处理方法组合在一块儿,摆脱了函数式中数据杂乱无章的场景,使得程序的功能整齐且清晰,而且经过设计类的继承关系让代码得以重用,进一步提升开发效率。以后出现的多种设计模式使得程序设计更加便捷方便。api

然而世界是复杂的,尽管OOP已经可以解决大部分的问题,仍是存在一些非强业务相关的通用功能,明明你们都须要,一旦要归类却发现很复杂,每每最后写出来一个工具类。这些功能就如同城市中的水电交通通常,渗透到家家户户中,却不能交由每家每户本身来维护。这些功能就像城市的一个个切面,须要一个统筹管理的方式。这个就是AOP造成的缘由。服务器

而什么叫横切关注点?先解释下关注点,就是对软件工程有意义的小的,可管理的可描述的软件组成部分。太拗口了对不对,个人理解就是一个操做一个方法都是对一个关注点的实现,好比插入订单,扣减库存,记录日志等等。而有些关注点是软件的核心功能,称为主关注点,好比插入订单,有些关注点则弥散在软件内部,好比记录日志,这些关注点同许多不一样的主关注点都有交集,称为横切关注点。主关注点大都经过OOP的方式去设计更加清晰,而从主关注点中分离出横切关注点则就是面向切面的程序设计的核心概念。架构

分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中再也不含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系经过切面来封装、维护,这样本来分散在整个应用程序中的变更就能够很好的管理起来。框架

维基百科中对面向切面编程的操做方式给了很专业的解说。而当前已经出现了AOP的特定实现或AOP相关技术,好比模块化

  • AspectJ:源代码和字节码级别的编织器,需用使用Aspect语言
  • AspectWerkz:AOP框架,使用字节码动态编织器和XML配置
  • JBoss-AOP:基于拦截器和元数据的AOP框架,运行在JBoss应用服务器上
  • BCEL(Byte-Code Engineering Library):Java字节码操做类库
  • Javassist:Java字节码操做类库

同时有一个AOP联盟对AOP作了一个抽象和规范,造成了一个三层的表明性架构,以及一个通用的AOP API,这个API就是常用的aopalliance-api-1.0.jar。它定义了AOP的几个通用接口:函数

  • 链接点(Join Point):程序执行过程当中的某个点,如方法的调用或异常的处理
  • 加强(Advice):对特定链接点的动做的扩展或改变
  • 拦截器(Inteceptor):继承了Advice接口,加强(Advice)模型的封装,通常围绕链接点造成拦截器链
  • 调用(Invocation):继承了JoinPoint接口,指围绕链接点的拦截器触发的调用

而对于加强(Advice),一般又分为如下几种类型工具

  1. 前置加强(Before advice):在链接点以前执行,它不能阻止流程继续执行(除非抛出异常)
  2. 后置加强(After returning advice):链接点正常完成后将被执行
  3. 最终加强(After finally advice):不管链接点是否正常执行完成,最后都将被执行(至关于finally语句)
  4. 抛出加强(After throwing advice):当方法抛出一个异常时将被执行
  5. 环绕加强(Around advice):最强大的加强方式,围绕链接点的加强。它能够在方法执行先后触发自定义行为,甚至能够选择是否执行原方法以及经过定义本身的返回值或抛出异常来提早结束方法执行。

2.Spring AOP

在AOP框架的实现上,在Spring以前已经已有不少,但Spring作出了一些独特的创新。

  1. 彻底由java实现,无须特殊的编译过程。不管是AspectJ仍是JBoss-AOP,都须要特定的编译器。对于追求便捷的开发者来讲,无疑并非最优的。
  2. 集成IOC容器,从而解决企业应用上的通用问题。这点上,Spring并非最完善的AOP框架,可是其自身的AOP实现以及同AspectJ的集成,已经能覆盖从简单到复杂的绝大部分使用场景,而注解的使用更是大大简化了AOP的配置。

而Spring AOP在实现过程当中,对Aop联盟定义的API进行了扩展和加强。

  • 加强(Advice):沿用AOP联盟的接口
  • 切点(Pointcut):至关于链接点(Join Point),增长了getClassFilter和getMethodMatcher两个接口方法,用于对不一样Advice的所做用的横切关注点的过滤和匹配。
  • 切面(Advisor):结合加强与切点,造成切面。

而对于AOP的具体实现,Spring AOP默认使用JDK的动态代理来代理接口。而对于没有实现接口的类,或非接口中的方法,则经过CGLIB来实现代理。经过Advisor封装Advice和Pointcut并初始化成拦截器链,当方法调用请求时,匹配其所围绕的全部Advisor,而后按顺序执行,从而达到面向切面编程的核心,分离出横切关注点进行统一配置与管理。具体的实现方式将在以后的章节里详细介绍。

相关文章
相关标签/搜索