Spring中的AOP(二)——AOP基本概念和Spring对AOP的支持

Easter79
• 阅读 495

AOP的基本概念

    AOP从运行的角度考虑程序的流程,提取业务处理过程的切面。AOP面向的是程序运行中的各个步骤,希望以更好的方式来组合业务逻辑的各个步骤。AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定切入点,而不与具体某个类耦合(即在不污染某个类的情况下,处理这个类相关的切点)。下面是一些AOP的一些术语:

    切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点通常会横切多个对象,因此常被称为横切关注点

    连接点(JoinPoint):程序执行过程中明确的点,如方法调用,或者异常抛出。Spring AOP中,连接点总是方法调用。

    增强处理(Advice):AOP框架在特定的切入点执行的增强处理。处理有around,before,after等类型。(说明:AOP是比较前沿的知识,而大部分国内翻译人士在翻译计算机文献时,总是一边看各种翻译软件和词典,一边逐字逐句的翻译,而不是先去从总体上把握知识的架构。因此难免导致一些术语翻译的词不达意,在AOP的术语上也存在较大差异,对于Advice一词,有人翻译为“通知”,有人翻译为“建议”......实际上,Advice是指AOP框架在特定切面所加入的某种处理,笔者这里翻译为“增强处理”,希望可以表达出Advice的真正含义)

    切入点(PointCut):可以插入增强处理的连接点。简而言之,当某个连接点满足执行要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。例如:

pointcut xxxPointcut():execution(void H*.say*())

    每个方法被调用都只是连接点,但如果该方法属于H开头的类,且方法名以say开头,按该方法的执行将变成切入点。如何使用表达式来定义切入点是AOP的核心,Spring默认使用AspectJ切入点语法。

  • 引入:将方法或字段添加到被处理的类中。Spring允许引入新的接口到任何被处理的对象

  • 目标对象:被AOP框架进行增强处理的对象,也被称为增强的对象。如果AOP框架是通过运行时代理来实现的,那么这个对象将是一个被代理的对象。

  • AOP代理:AOP框架创建的对象,简单地说,代理就是对目标的对象的加强。Spring中AOP代理可以是JDK动态代理,也可以是CGLIB代理。前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。

  • 织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程就是织入。织入有两种实现方式:编译时增强(如AspectJ)和运行时增强(如CGLIB)。Spring和其他纯Java AOP框架一样,在运行时织入。

    由前面的介绍知道:AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但AOP代理中的方法与目标对象的方法存在差异:AOP方法在特定切入点增加了增强处理,并回调了目标对象的方法。

Spring的AOP支持

    Spring中AOP代理由Spring的IoC容器负责生成、管理。其依赖关系也由IoC容器负责管理。因此AOP代理可以直接使用容器中的其他Bean作为目标,这种关系可由IoC容器的依赖注入提供。Spring默认支持使用JDK动态代理来创建AOP代理,这样就可以为任何接口实现创建代理了。

    Spring也支持CGLIB代理,在需要代理类而不是代理接口的时候,Spring自动会切换为使用CGLIB代理。但Spring推荐使用面向对象编程,因此业务对象通常都会实现一个或多个接口,此时默认将使用JDK动态代理,但也可以强制使用CGLIB。

    Spring AOP使用纯Java实现。它不需要专门的编译过程。Spring AOP不需要控制类装载器的层次,因此它可以在所有JavaWeb容器或应用服务器中运行良好。

    Spring目前仅支持将方法调用作为连接点(JoinPoint),如果需要把对Field的访问和更新也作为增强处理(Advice)的连接点,则可以考虑使用AspectJ。

    Spring实现AOP框架跟其他的框架不同。Spring并不是要提供最完整的AOP实现(尽管Spring AOP有这个能力),而是侧重于AOP实现和Spring IoC之间的整合,用于帮助解决在企业级开发中的常见问题。因此,Spring通常和IoC容器一起使用,Spring从来就没有通过提供一种全面的AOP解决方案来与AspectJ竞争。Spring AOP采用基于代理的AOP实现方案,而AspectJ则采用编译时增强的解决方案。

    Spring2.0可以无缝的整合Spring AOP、IoC和AspectJ,是的所有的AOP应用完全融入基于Spring的框架,这样的集成不会影响Spring AOP API或者AOP Alliance API,Spring AOP保持了向下兼容性,依然允许直接使用Spring AOP API来完成AOP编程。

    一旦我们掌握了AOP的概念,不难发现进行AOP编程是一件很简单的事情。纵观AOP编程,其实需要程序员参与的只有三个部分:

  • 定义普通的业务组件

  • 定义切入点(PointCut),一个切入点可能横切多个业务组件

  • 定义增强处理(Advice),增强处理及时在AOP框架为普通业务组件织入时的处理动作

    第一部分是最为平常的事情了,无需说明。第二、三部分就是AOP的关键:一旦定义了合适的切入点和增强处理,AOP框架将会自动生成代理,而AOP代理的方法大致有如下公式:

    代理对象的方法 = 增强处理 + 被代理对象的方法

    Spring 1.x采用自身提供的AOP API来定义切入点和增强处理,程序可以直接使用Spring AOP API来定义切入点和增强处理,但这种方式似乎有些过时了,现在通常建议使用AspectJ方式来定义切入点和增强处理,在这种方式下,Spring依然有如下两种选择来定义切入点和增强处理:

  • 基于注解的配置方式:使用@Aspect ,@Pointcut等注解来标注切入点和增强处理

  • 基于XML配置文件的方式

【未完,待续】

点赞
收藏
评论区
推荐文章
kenx kenx
2年前
SpringBoot Aop 详解和多种使用场景
前言aop面向切面编程,是编程中一个很重要的思想本篇文章主要介绍的是SpringBoot切面Aop的使用和案例什么是aopAOP(AspectOrientedProgramming):面向切面编程,面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻
推荐学java 推荐学java
2年前
推荐学java——Spring之AOP
tips:本文首发在公众号逆锋起笔,本文源代码在公众号回复aop即可查看。什么是AOP?AOP(AspectOrientProgramming),直译过来就是面向切面编程。AOP是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。为什么需要AOP?实际开发中我们应
Stella981 Stella981
2年前
Spring 学习笔记(四):Spring AOP
@\TOC\1概述本文主要讲述了AOP的基本概念以及在Spring中AOP的几种实现方式。2AOPAOP,即AspectOrientedProgramming,面向切面编程,与OOP相辅相成。类似的,在OOP中,以类为程序的基本单元,在AOP中的基本单元是Aspect
Wesley13 Wesley13
2年前
AOP系列
AOP(AspectOrientProgramming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以SpringAOP为代表。本文
Wesley13 Wesley13
2年前
Java——基于AspectJ的AOP开发
1.AspectJ简介AspectJ是一个基于Java语言的AOP框架。Spring2.0以后新增了对AdpectJ切点表达式的支持。@AspectJ是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面。新版本Spring框架,建议使用AspectJ方式来开发AOP。使用AspectJ需要导
Wesley13 Wesley13
2年前
AOP相关概念
1.AOP(面向切面编程)在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,在软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型.利用AOP
Easter79 Easter79
2年前
Spring框架中的AOP技术
1、AOP概述AOP技术即AspectOrientedProgramming的缩写,译为面向切面编程。AOP是OOP的一种延续,利用AOP技术可以对业务逻辑的各个部分进行隔离,从使得业务逻辑各部分之间的耦合性降低,提高程序的可重用性,同时提高了开发的效率。AOP采用横向抽取机制,取代了传统纵向继承体系重复性代码,AOP可以在不修改源代码的
Wesley13 Wesley13
2年前
Spring AOP教程
一、概念AOP(AspectOrientedProgramming):面向切面编程。面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。二、用途日志记
Easter79 Easter79
2年前
Spring知识点提炼
1\.Spring框架的作用清理:Spring是轻量级的,基本的版本大小为2MB控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。面向切面的编程AOP:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。容器:Spring包含并管理应用中对象
Wesley13 Wesley13
2年前
Spring学习总结(4)——Spring AOP教程
一、概念AOP(AspectOrientedProgramming):面向切面编程。面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。二、用途日志记
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k