Spring 面向切面编程的基本概念

2016-03-25 19:42:01   最后更新: 2016-03-25 20:27:03   访问数量:917




前面几篇日志,我们介绍了让软件组件保持松散耦合的依赖注入机制:

Spring Bean

 

面向切面的 AOP 编程允许你把遍布在应用各处的功能分离出来形成可重用组件

通常,系统由许多不同组件组成,每一个组件各负责一块特定功能,然而,通常组件还需要承担额外的职责,如日志、事务管理、安全等等,这些系统服务通常被称为“横切关注点”,通常跨越系统的多个组件

这些横切关注点的存在,增加了代码的复杂性,遍布系统的关注点很难统一修改其逻辑,而组件又与自身核心业务无关的代码耦合而变得混乱,面向切面编程就是为了解决这个问题而存在的

AOP 让这些横切关注点服务模块化,以声明的方式将他们应用到他们需要影响的组件中去,让组件更加关注自身业务,而不需要了解系统服务

 

 

 

如图所示,面向切面拥有如下几个基本概念:

 

通知 -- Advice

AOP 中,切面的工作被称为通知,通知定义了切面是什么以及何时工作

Spring 的切面可以应用下列五种类型的通知:

  1. Before -- 在方法调用之前调用通知
  2. After -- 在方法完成之后调用通知,无论方法是否执行成功
  3. After-returning -- 在方法成功执行之后调用通知
  4. After-throwing -- 在方法抛出异常后调用通知
  5. Around -- 在被通知的方法调用之前和之后执行通知

 

连接点 -- Joinpoint

程序允许被切面切入的时机被称为“连接点”

通常连接点可以使调用方法时、抛出异常时或修改一个字段时

Spring 只支持方法连接点

 

切点 -- pointer

切点定义了哪些类的哪些连接点需要被切入

通常我们使用明确的类名、方法名来指定切点,也可以用正则表达式定义匹配的类和方法名的模式

 

切面 -- Aspect

切面是通知和切点的集合,通知和切点共同定义了关于切面的全部内容

 

引入 -- Introduction

AOP 允许我们通过“引入”向现有类中添加新的方法或属性

 

织入 -- Weaving

将切面应用到目标对象来创建新的代理对象的过程称之为“织入”

通常可以在编译期、类加载期或运行期织入

编译期需要重新设计编译器,AspectJ 的织入编译器就是以这种方式织入的

类加载期需要特殊的类加载器,LTW 就支持这种方式织入切面

Spring AOP 容器则是在应用运行的某个时刻织入切面的

 

Spring AOP 中,需要使用 AspectJ 的切点表达式语言来定义切点,Spring 仅支持 AspectJ 切点指示器的一个子集:

Spring 支持的 AspectJ 切点表达式
AspectJ 指示器描述
arg限制连接点匹配参数为指定类型的执行方法
@args限制连接点匹配参数为指定注解标注的执行方法
excution用于匹配连接点的执行方法
this限制连接点匹配 AOP 代理的 bean 引用为指定类型的类
target限制连接点匹配目标对象为指定类型的类
@target限制连接点匹配指定对象,这些对象对应的类具备指定类型的注解
within限制连接点匹配指定的类型
@within限制连接点匹配指定注解所标注的类型
@annotation限制匹配带有指定注解的连接点

 

除此之外,Spring 2.5 还引入了一个 bean 指示器,允许我们在切点表达式中使用 bean 的 ID 或名称来标识特定的 bean

 

我们以 execution 为例,介绍一下切点表达式的使用方法:

execution(* com.springinstance.techlog.Instrument.play(..))

 

 

这里匹配了所有的 com.springinstance.techlog.Instrument 类实例的 play 方法

* 表示返回任意类型,参数列表中的 .. 表示使用任意参数

 

除此之外,我们还可以通过与(&&)、或(||)、非(!)操作符连接多个表达式:

execution(* com.springinstance.techlog.Instrument.play(..)) && within(com.springinstance.techlog.*)

 

在 within 中,我们指定了匹配 com.springinstance.techlog 包下的任意类

 

Spring 的 AOP 配置命名空间中,提供了声明式切面的选择:

Spring AOP 配置元素简化 POJO 切面声明
AOP 元素描述
<aop:config>顶层 AOP 配置元素,大多 <aop:*> 元素需要在 <aop:config> 内
<aop:advisor>定义 AOP 通知器
<aop:before>定义 AOP 前置通知
<aop:after>定义 AOP 后置通知器(不管被通知的方法是否执行成功)
<aop:after-returning>定义 AOP after-returning 通知
<aop:after-throwing>定义 AOP after-throwing 通知
<aop:around>定义 AOP 环绕通知
<aop:aspect>定义切面
<aop:aspectj-autoproxy>启用 @AspectJ 注解驱动切面
<aop:declare-parents>为被通知的对象引入额外接口,并透明的实现
<aop:pointcut>定义切点

 






技术帖      web      xml      龙潭书斋      framework      spring      ioc      aop      面向切面      设计模式      aspect      aspectj      切面      切点      通知     


京ICP备15018585号