Aspect Oriented Programming(AOP),即面向切面编程,是前段时间比较是一个比较热门的话题,在学校老师给我们讲OOP的时候,就经常提到它。面向切面编程主要实现的目的是针对业务处理过程中的切面提取,它所面对的是某个步骤或阶段的统一处理过程,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们上星期完成的日志记录和权限管理就采用了这一技术。

我们举个简单的列子,我们现在提供一个服务修改订单信息的,但是我们希望记录有谁进行了这个操作。那我们实现了一个订单的服务接口和其实现类,同时为了要进行记录的话,那我们在实现类中就要添加其实现记录的过程。

这样的话,假如我们要实现的服务有多个呢?那就要在每个实现的类都添加这些类似且重复的记录过程。这样做的话就会有点繁琐,而且每个实现类都与记录服务日志的行为紧耦合,违反了面向对象的规则。

那么怎样才能把记录服务的行为与业务处理过程中分离出来呢?看起来好像就是修改订单的服务自己在进行,但却是背后日志记录对这些行为进行记录,并且修改订单的服务不知道存在这些记录过程,这就是我们要讨论AOP的目的所在。

下面介绍一些AOP的概念,方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。

AOP框架必须允许开发者指定切入点,例如,使用正则表达式。引入Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。目标对象:包扩连接点的对象,也被称作被通知或被代理对象。
切入点的概念是AOP的关键,它使AOP区别于其他使用拦截的技术。

切入点使通知独立于OO的层次选定目标, 拦截器也由此应运而生,目前我们使用的是基于JAVA的集成到Spring 中的 SpringAOP,用此来实现了日志和权限的统一管理。