(笔记)Spring实战_面向切面的Spring(1)_什么是面向切面编程

在软件开发中,分布于应用中多处的功能被称为横切关注的。通常,这些横切关注的从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中)。将这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的。
在使用面向切面编程时,我们仍然在一个地方定义通用功能,但是我们可以通过声明的方式定义这个功能以何种方式在何处应用,而无需修改受影响的类。横切关注点可以被模块化为特殊的类,这些类被称为切面。
1.定义AOP术语
描述切面的常用术语有通知、切点和连接点。
通知
在AOP术语中,切面的工作被称为通知。
通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
Spring切面可以应用5种类型的通知:
Before——在方法被调用之前调用通知
After——在方法完成之后调用通知,无论方法执行是否成功
After-returning——在方法成功执行之后调用通知
After-throwing——在方法抛出异常后调用通知
Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
连接点
我们的应用可能也需要对数以千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。
切点
切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用明确的类和方法名称来指定这些切点,或是利用正则表达式定义匹配的类和方法名称模式来指定这些切点。
切面
切面是通知和切点的结合。通知和切点共同定义了关于切面的全部内容——它是什么,在何时和何处完成其功能。
引入
引入允许我们向现有的类添加新方法或属性。
织入
织入是将切面应用到目标对象来创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。
编译期——切面在目标类编译时被织入。
类加载期——切面在目标类加载到JVM时织入。
运行期——切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。
2.Spring对AOP的支持
并不是所有的AOP框架都是一样的,它们在连接点模型上可能有强弱之分。有些允许对字段修饰符级别应用通知,而另一些只支持与方法调用相关的连接点。它们织入切面的方式和时机也有所不同。但是无论如何,创建切点来定义切面织入的连接点是AOP框架的基本功能。
Spring提供了4种各具特色的AOP支持:
基于代理的经典AOP
@AspectJ注解驱动的切面
纯POJO切面
注入式AspectJ切面(适合Spring各版本)
前3种都是Spring基于代理的AOP变体,因此,Spring对AOP的支持局限于方法拦截。如果AOP需求超过了简单方法拦截的范畴(比如构造器或者属性拦截),那么应该考虑在AspectJ里面实现切面,利用Spring的DI把Spring Bean注入到AspectJ切面中。
Spring通知是Java编写的
Spring所创建的通知都是用标准的Java类编写的。而且,定义通知所应用的切点通常在Spring配置文件里采用XML来编写的。
Spring在运行期通知对象
通过在代理类中包裹切面,Spring在运行期将切面织入到Spring管理的Bean中。
代理类封装了目标类,并拦截被通知的方法的调用,再将调用转发给真正的目标Bean。
当拦截到方法调用时,在调用目标Bean方法之前,代理会执行切面逻辑。
直到应用需要被代理的Bean时,Spring才创建代理对象。
Spring只支持方法连接点
Spring缺少对字段连接点的支持,无法让我们创建细粒度的通知,而且Spring也不支持构造器连接点,我们也无法在Bean创建时应用通知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章