一、什么是面向切面编程
Aspect Oriented Programming(AOP),面向切面编程主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这是百科给出的解释,简而言之,面向切面编程其实就是让我们的核心业务流程不受到其他辅助组件流程的侵入,达到核心业务与辅助业务的解耦效果,如下图所示:
图中UserService、ArticleService、CommentService为核心业务,安全、日志、事务等为辅助业务,核心业务流程在执行时不受辅助业务流程影响,比如我新增一个用户时,核心业务流程只关心用户数据的组装以及保存,至于用户有没有新增权限、需不需要记录日志、以及保存成功后事务的提交和数据库连接的释放,都不是核心业务所关心的事,这就是面向切面编程的思想。
二、AOP基本概念
1、横切关注点(Crosscut point)
在软件开发领域我们把散落在应用中多处的相同或者能够公用的功能称之为横切关注点,比如上图中的日志功能、权限认证功能、处理事务的功能等都是横切关注点。
2、通知(advice)
通知是切面需要执行的动作,通知总共有五种类型:
前置通知(Before):在目标方法调用之前通知;
后置通知(aftrer):在目标方法调用之后通知;
返回通知(After-Returning):在目标方法成功返回之后通知;
异常通知(After=throwing):在目标方法抛出异常之后通知;
环绕通知(Around):被通知方法包含在通知里面,在被通知的方法调用前、后、返回、异常等自定义处理逻辑,可以理解为是其他几个通知的代理,仅个人观点。
3、连接点(Join point)
连接点是一个应用执行过程中能够插入一个切面的点,切面代码可以利用这些点插入到应用的正常的业务流程中,这个点可以是调用方法时、抛出异常时、甚至修改一个字段时,我们可以简单的理解为连接点就是切点执行时机的集合。
4、切点(PointCut)
如果说通知定义了“什么”和“何时”,那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点。
5、切面(Aspect)
切面是通知和切点的集合。
6、引入(Introduction)
引入是向现有的类中动态添加添加方法或属性。
7、织入(Weaving)
织入是将切面应用到目标对象并创建新的代理对象的过程,在目标对象的生命周期里有多个点可以进行织入,比如:编译器,切面在目标类编译时被织入;类加载期,切面在目标类加载到JVM时织入;运行期,切面在程序运行的某个时刻被织入,Spring就是以这种方式实现切面的。
三、Spring对AOP的支持
以上对AOP术语的介绍查阅了好多资料,也加入了自己的理解,如果大家觉得理解起来有点抽象,不必在意,我会在下的案例讲解中,详细的介绍,下面我们来看Spring对AOP的支持。
1、Spring AOP是用纯Java实现的。不需要特殊的编译过程也不需要控制类加载器的层次结构,因此适合在servlet容器或应用程序服务器中使用。
2、Spring AOP目前仅支持执行方法时的连接点(建议在Spring bean上执行方法)。
3、Spring AOP的实现途径与其他大多数AOP框架不同。它的目的不是提供最完整的AOP实现(尽管Spring AOP非常强大)。相反,是在AOP实现和Spring IoC之间提供紧密集成,以帮助解决企业应用程序中的常见的问题。
4、Spring AOP无法完成更加细粒度的通知,例如拦截对象字段的修改等,这个与它的设计初衷有很大关系,比如在第三点中提到的,它的目的不是提供AOP最完整的实现而是对SpringIOC的紧密集成,如果我们需要更加细粒度的去控制通知,可以选择AspectJ框架, Spring将Spring AOP和IoC与AspectJ无缝集成,来完成面向切面编程的所有实现。
以上是Spring官方对SpringAop的定位,我做了简单的总结,从下次开始,我们将正式进入面向切面编程的学习。
更多最新技术文章,请关注“冰点IT”公众号