AOP(Aspect-Oriented  Programming,面向切面编程)是Spring提供的关键技术之一。

AOP基于IoC,是对OOP(Object-Oriented Programming,面向对象编程)的有效补充。

利用一种“横切”的技术,剖解封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为Aspect(切面,也称方面)。

AOP的核心思想就是“将应用程序中的业务逻辑与对其提供支持的通用服务功能进行分离,而业务逻辑与通用服务功能之间通过配置信息,实现整合”。

实现AOP的技术主要分为两大类:

一是采用动态代理技术,采用拦截器截取消息的方法,对该消息进行“插装”,以取代原有对象行为的执行;

二是采用静态织入的方式,引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”代码。

Spring AOP是实现AOP的一种技术,是采用“动态代理技术”实现的。

(一)AOP技术相关的概念和术语

1)几个相关概念:

在小编的上篇博文中,在对原来的业务逻辑进行处理加入AOP部分时,类A中所有方法的执行前后,都成为了“所关注的地方”,这个地方称为“横切关注点”。这样原来的业务逻辑被分割开来,所以这个点也就成了联系前后逻辑的连接点,称为“连接点”。然后,对于整个原来的业务逻辑,我们需要告诉程序“在什么时候添加新的附加功能”,这里的“什么时候”的时机称为“通知”。在本例中“通知”有两个:“在类A中所有方法的执行前添加”称为“前置通知”;“类A中所有方法的执行后添加”称为“后置通知”。

例子中前置通知:

<!-- 配置前置通知及前置通知的切入点 -->
<aop:before method="methodX1" pointcut="execution(* com.edu.aop.hello.A.*())"></aop:before>

后置通知:

<!-- 配置后置通知及后置通知的切入点 -->
<aop:after method="methodX2" pointcut="execution(* com.edu.aop.hello.A.*())"></aop:after>

当原来的业务逻辑被“横向关注点”分割后,就可以在“该点”处插入(切入)新需求功能模块,这里将指明插入(切入)新需求功能模块的“地方”(配置文件代码部分)称为“切入点(Pointcut)”,而要插入的功能模块,称为“切面(Aspect)”。可见,配置“切面”就是指出:在什么地方(连接点)切入什么模块(切面)的哪个方法

2)Aspect(切面,也称方面)

是对系统中横切关注点逻辑进行模块化封装的AOP概念实体(就是定义一个类),它可以包含多个Pointcut(切入点)及相关的Advice(通知)定义。例如本例中的类X。

3)JoinPoint(连接点)

系统在运行之前,AOP的功能模块需要织入到OOP的功能模块中。要进行这种织入过程,需要知道在系统的哪些功能点上进行织入操作,这些将要在其上进行织入操作的系统功能点称为JoinPoint。

在Spring AOP中,一个连接点总是表示一个方法的执行。

常见的几种JoinPoint类型:方法调用、方法执行、构造方法调用、构造方法执行、字段设置、字段获取、异常处理执行、类初始化。

4)Pointcut(切入点)

Pointcut是对JoinPoint的形式描述,用于指出要对哪些Joinpoint进行拦截的定义。

(初学可理解为二者相同,只不过Pointcut用在配置文件的通知中;JoinPoint用在切面类中)

Pointcut通常和“一个切入点表达式”相关联,来表示在需要在哪些功能点上织入AOP的功能。

常见的Pointcut方式:

(1)直接指定JoinPoint所在的方法名称;

(2)正则表达式,Spring的AOP支持该种方式;

(3)使用特定的Pointcut表述语言。

5)Advice(通知)

一个Advice对应一个横切关注点逻辑的载体,它代表将会织入到JointPoint的横切逻辑:在切面的某个特定的连接点上执行的逻辑。

一个切面包括一个或者多个通知,每个通知就是告诉“在什么时机”调用执行什么方法。

Spring AOP提供了5种通知:

Before Advice(前置通知)、After Returning Advice(返回通知)、After throwing Advice(异常通知)、After Advice(后置通知)、Around Advice(环绕通知)

6)Target(目标对象)

通知被应用的对象(包含连接点的对象,或者说被通知或被代理的对象),即符合Pointcut所指定的条件,将在织入过程中被织入横切逻辑的对象。

本例中,即是A类的所有方法。

7)AOP Proxy(AOP 代理)

AOP框架创建的对象,用来执行切面(Aspect)的内容。

8)Weave(织入)

将Aspect应用到Target对象并导致Proxy对象创建的过程称为织入。

9)拦截机(Interceptor)

拦截器(也称拦截机)是AOP的另一种叫法。

(二)切入点表达式

通常,切入点表达式用于给出Pointcut对JointPoint的形式描述,指出要对哪些JoinPoint进行拦截。

切入点表达式的格式如下:

execution(方法访问权限 返回类型 方法的包路径.方法名(方法的参数)异常类型)

例如本例中:

execution(* com.edu.aop.hello.A.*())

使用说明:

1)“返回类型”、“方法名”和“方法参数”是必选项,其他各项是可选项;

2)在“切入点表达式”中可以使用通配符。

常用通配符:

“*”代表不包含“.”的字符串,若要包含“.”,必须使用转义符号“\.”;

“..”代表任意数量任意类型的参数。

3)名称模式匹配的是方法名。可以用*通配符表示匹配所有方法名。

4)若在同一包中,可省略包名,直接给出类(接口)名称;

5)切入点表达式可以通过操作符“&&”、“||”、“!”进行合并运算,形成一个新的切入点表达式。

例:

execution(* com.edu.aop.hello.A.*())||execution(* *.add(..))

(三)两种常用的AOP编程方法

1)基于XML配置的AOP编程。上篇博文案例就是此种编程方法,重点就是配置“切面信息”;

2)基于AspectJ注解配置的AOP编程。采用注解方式编程,所有的配置信息都在源代码中标注,非常简单方便。

两种AOP编程方法的设计思想与设计过程基本一致,即创建切面类、配置(注解)切面和配置(注解通知)。

参考书籍:《Java EE框架开发技术与案例教程》

Spring学习之旅(六)Spring AOP工作原理初探的更多相关文章

  1. Spring学习之旅(六)--SpringMVC集成

    对大多数 Java 开发来说,基于 web 的应用程序是我们主要的关注点. Spring 也提供了对于 web 的支持,基于 MVC 模式的 Spring MVC 能够帮助我们灵活和松耦合的完成 we ...

  2. Spring 学习笔记(六)—— AOP的简单理解

    系统中的业务可以分为核心关注点和横切关注点. 核心关注点时业务处理的主要流程,而横切关注点是与核心业务无关但更为通用的业务. 各个横切关注点离散地穿插于核心业务之中,导致系统地每一个模块都与这些业务具 ...

  3. Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探

    由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...

  4. Spring学习(二)——Spring中的AOP的初步理解[转]

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  5. Spring学习(二)——Spring中的AOP的初步理解

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  6. spring 学习(三):aop 学习

    spring 学习(三):aop 学习 aop 概念 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 3 aop底层使用动态代 ...

  7. Spring学习之旅(十)--MockMvc

    在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...

  8. Spring学习之——手写Spring源码V2.0(实现IOC、D、MVC、AOP)

    前言 在上一篇<Spring学习之——手写Spring源码(V1.0)>中,我实现了一个Mini版本的Spring框架,在这几天,博主又看了不少关于Spring源码解析的视频,受益匪浅,也 ...

  9. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

随机推荐

  1. Zookeeper 集群安装配置,超详细,速度收藏!

    今天,栈长分享下 Zookeeper 的集群安装及配置. 下载 下载地址:http://zookeeper.apache.org/ 下载过程就不说了,我们下载了最新的zookeeper-3.4.11. ...

  2. C# 配置文件Xml读写

    分析xxx.exe.config文件: <?xml version="1.0" encoding="utf-8"?> <configurati ...

  3. 2.java面向对象类与类/类与对象之间关系详解

    继承.实现.依赖.关联.聚合.组合的联系与区别 下面的内容很基础,同时也很简单,但是也很重要. 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功 ...

  4. 如何配置React Native真机调试-iOS

    说在前面,本教程是建立在项目已经成功在模拟器上运行的基础上,如果你是还未配置好环境的新手,建议先从官网快速入门开始:官网英文版 . 中文版 ok, 切入正题,当你已经完成好环境配置,在模拟器上成功的运 ...

  5. Ocelot简易教程(五)之集成IdentityServer认证以及授权

    Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocelot简易教程(二)之快速开始1 Ocelot简易教程(二)之快速开始2 Ocelot简易教程(三)之主要特性及路由详解 ...

  6. 导入项目报错【Minimum supported Gradle version is 3.3. Current version is 2.14.1】

    问题描述 导入项目的时候,因为同事的开发环境是Android Studio 2.3.2  Gradle3.3.而我的开发环境是Android Studio 2.2.2 Gradle2.14.1. 所以 ...

  7. Selenuim自动化测试模型

    本章内容: 概念介绍 自动化测试模型 一.概念 自动化测试库.框架.工具之间的区别: 库是由代码集合成的一个产品,供程序员调用,面向对象的代码组织形成的库叫类库,面向过程的代码组织形成的库叫函数库. ...

  8. 解决:MVC对象转json包含\r \n

    项目中对象转json字符串时,如下:JsonSerializerSettings jsetting = new JsonSerializerSettings(); jsetting.DefaultVa ...

  9. 【EF6学习笔记】(十一)实施继承

    上篇链接:EF学习笔记(十) 处理并发 本篇原文链接:Implementing Inheritance 面向对象的世界里,继承可以很好的重用代码.在本章就对Instructor和Student两个类进 ...

  10. Long类型时间如何转换成视频时长?

    数据库中存放的视频时长是一个Long类型的毫秒/秒时间,现在需要把这个时间转换成标准的视频时长格式,在我看来这应该是一个很常用的转化有一个很常用的转换方法工具才对,可是我百度找了许久,没有一个简单直观 ...