AOP的一些概念
我们从定义一些核心的AOP概念开始。这些名词并不是Spring.NET专有的。不幸的是,AOP的术语并不一看上去那么浅显易懂。然而如果Spring.NET使用自己的名词会更加让人困惑。
- 切面(aspect):一个关注点的模块化,这个关注点在执行时候可能横切多个实体对象。在企业级应用中,事务管理就是一个很好的横切例子。 切面在Spring.NET中被当作通知器(Advisors)或者拦截器(interceptors)。
- 连接点(Joinpoint):程序执行时候的一些时间点,例如调用一个方法的时候,或者一个特定的异常被抛出的时候。
- 通知(Advice):AOP框架在特定的连接点执行的动作。不同类型的通知包括”环绕“,”前置“和”抛出异常后“。通知的类型将会在下文中讨论。很多AOP框架,包括Spring.NET,模型和通知都被当作拦截器”interceptor“,这些框架就围绕着连接点去维护这一系列拦截器。
- 切入点(Pointcut):当一个通知被激活的时候的一系列连接点。一个AOP框架必须可以让开发者去定义特定的切入点,例如使用正则表达式。
- 引入(Introduction):向一个通知类中加入方法或者属性。Spring.NET允许你将新的接口引入到任何的通知实体中。例如,你可以使用通知让任何实体去实现IAuditable接口来使追踪实体状态的变化更加简便。
- 目标(Target object):包含连接点的实体,可以是被通知或者代理对象。
- AOP代理(AOP proxy):AOP框架生成的实体,包括通知。在Spring.NET中,一个AOP代理是一个动态代理,在进行时通过IL中间语言生成。
- 织入(Weaving):将多个切面组合成一个通知实体。这个可以在编译时(例如使用 GripperLoom.NET compiler)或者在运行时完成。Spring.NET是在运行时完成织入。
不同的通知类型包括:
- 环绕通知(Around advice):通知围绕一个连接点,例如一个方法被调用。这个是一种最强大的通知类型。环绕通知会在方法调用前后完成自定义的行为,它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
- 前置通知(Before advice):通知在连接点之前执行,但是并没有能力阻止接下来的程序执行(除非程序抛出异常)。
- 抛出异常后通知(Throws advice):通知在一个方法抛出异常之后执行。Spring.NET提供了强类型的抛出异常后通知,所以你可以截获你需要的异常而不一定去处理这些异常。
- 返回后通知(After returning advice):通知在连接点正常经过后执行,例如一个方法正常返回没有抛出异常。