`
y806839048
  • 浏览: 1107435 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Spring AOP 之 通知、连接点、切点、切面

阅读更多

总结:

通知:定义了什么时候,用什么

切点:定义了在何处用

切点+通知=切面(我们定义的aop类)---什么时候,什么地点用什么

连接点:程序中可以插入切面的地方

织入:在连接点织入切面

 

 

示例:

 

 

1:知识背景

软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点。而为直切关注点提供服务的,就是横切关注点。

2:面向切面的基本原理

什么是面向切面编程

横切关注点:影响应用多处的功能(安全、事务、日志)

切面:

横切关注点被模块化为特殊的类,这些类称为切面

优点:

每个关注点现在都集中于一处,而不是分散到多处代码中
服务模块更简洁,服务模块只需关注核心代码。

AOP 术语

  • 通知:
    • 定义:切面也需要完成工作。在 AOP 术语中,切面的工作被称为通知。
    • 工作内容:通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决何时执行这个工作。
    • Spring 切面可应用的 5 种通知类型:
  1. Before——在方法调用之前调用通知
  2. After——在方法完成之后调用通知,无论方法执行成功与否
  3. After-returning——在方法执行成功之后调用通知
  4. After-throwing——在方法抛出异常后进行通知
  5. Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
  • 连接点:
    • 定义:连接点是一个应用执行过程中能够插入一个切面的点。
    • 连接点可以是调用方法时、抛出异常时、甚至修改字段时、
    • 切面代码可以利用这些点插入到应用的正规流程中
    • 程序执行过程中能够应用通知的所有点。
  • 切点:
    • 定义:如果通知定义了“什么”和“何时”。那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点。
    • 通常使用明确的类或者方法来指定这些切点。
    • 作用:定义通知被应用的位置(在哪些连接点)
  • 切面:
    • 定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。
  • 引入:
    • 引入允许我们向现有的类中添加方法或属性
  • 织入:
    • 织入是将切面应用到目标对象来创建的代理对象过程。
    • 切面在指定的连接点被织入到目标对象中,在目标对象的生命周期中有多个点可以织入
  1. 编译期——切面在目标类编译时期被织入,这种方式需要特殊编译器。AspectJ的织入编译器就是以这种方式织入切面。
  2. 类加载期——切面在类加载到
  3. JVM ,这种方式需要特殊的类加载器,他可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5 的 LTW 就支持这种织入方式
  4. 运行期——切面在应用运行期间的某个时刻被织入。一般情况下,在织入切面时候,AOP 容器会为目标对象动态的创建代理对象。Spring AOP 就是以这种方式织入切面。

3:Spring 对 AOP 的支持

  • 并不是所有的 AOP 框架都是一样的,他们在连接点模型上可能有强弱之分。
    • 有些允许对字段修饰符级别应用通知
    • 有些支持方法调用连接点
  • Spring 提供的 4 种各具特色的 AOP 支持
  1. 基于代理的经典 AOP;
  2. @AspectJ 注解驱动的切面;
  3. 纯 POJO 切面;
  4. 注入式 AspectJ 切面; Spring
  • 在运行期间通知对象
    • 通过在代理类中织入包裹切面,Spring 在运行期间将切面织入到 Spring 管理的 Bean 中。
      代理类封装了目标类,并拦截被通知的方法调用,再将调用转发给真正的目标 Bean
      技术分享
      当拦截到方法调用时,在调用目标 Bean 方法之前,代理会执行切面逻辑。
      当真正应用需要被代理的 Bean 时,Spring 才创建代理对象。如果使用 ApplicationContext,在 ApplicationContext 从 BeanFactory 中加载所有 Bean 时,Spring 创建代理对象,因为 Spring 在运行时候创建代理对象,所以我们不需要特殊的编译器来织入 Spring AOP 的切面。
  • Spring 支持方法创建连接点
    • 因为 Spring 基于动态代理,所以 Spring 只支持方法连接点。
    • Spring 缺失对字段连接点的支持,无法让我们更加细粒度的通知,例如拦截对象字段的修改
    • Spring 缺失对构造器连接点支持,我发在 Bean 创建时候进行通知。

4:使用切点选择连接点

  • 切点用于准确定位,确定在什么地方应用切面通知。
  • Spring 定义切点
    • 在 Spring AOP 中,需要使用 AspectJ 的切点表达式来定义切点。
AspectJ 指示器 描述
arg () 限制连接点的指定参数为指定类型的执行方法
@args () 限制连接点匹配参数由指定注解标注的执行方法
execution () 用于匹配连接点的执行方法
this () 限制连接点匹配 AOP 代理的 Bean 引用为指定类型的类
target () 限制连接点匹配特定的执行对象,这些对象对应的类要具备指定类型注解
within() 限制连接点匹配指定类型
@within() 限制连接点匹配指定注释所标注的类型(当使用 Spring AOP 时,方法定义在由指定的注解所标注的类里)
@annotation 限制匹配带有指定注释的连接点

1. 创建自己的切点
技术分享
- execution( ) 指示器选择 Instrument 的 play( ) 方法。
方法表达式是以 * 号开头,标识了我们不关心的方法返回值的类型。
* 后我们指定了权限定类名和方法名。
对于方法的参数列表,使用(..)标识切点选择任意的 play( ) 方法,无论入参是什么。
- 假设我们需要匹配切点仅匹配 com.Springinaction.springidol 包。可以使用 within()
技术分享
注意 && 是将 execution( ) 和 within( ) 连接起来,形成的 and 关系。同理也可以使用 || 或关系、!非关系
- 创建 Spring 的 bean( ) 指示器
Spring 2.5 引入一个新的 bean( ) 指示器,该指示器允许我们在切点表达式中使用 Bean ID 来标识 Bean
bean( ) 使用 Bean ID 或 Bean 名称作为参数来限制切点只匹配特定 Bean。
如下,我们希望执行 Instrument 的 play( ) 方法时候应用通知,但限定 Bean 的 ID 为 eddie
技术分享
还可以使用非操作作为除了指定 ID 的 Bean 以外的其他 Bean应用通知
技术分享
在此场景下,切面会通知被编织到所有 ID 不为 eddie 的 Bean 中

5:在 XML 中声明切面

Spring 的 AOP 配置元素简化了基于 POJO 切面声明

AOP 配置元素 描述
aop : advisor 定义 AOP 通知器
aop : after 定义 AOP 后置通知(不管被通知方法是否执行成功)
aop : after-returing 定义 AOP after-returing 通知
aop : after-throwing 定义 AOP after-throwing 通知
aop : around 定义 AOP 环绕通知
aop : aspect 定义切面
aop : aspectj-autoproxy 启动 @AspectJ 注解驱动的切面
aop : before 定义 AOP 前置通知
aop : config 顶层的 AOP 配置元素,大多数 aop : * 元素必须包含在 元素内
aop : declare-parents 为被通知的对象引入额外接口,并透明的实现
aop : pointcut 定义切点

Spring AOP 之 通知、连接点、切点、切面。

标签:

原文地址:http://blog.csdn.net/github_34889651/article/details/51321499

 
分享到:
评论

相关推荐

    spring AOP切面编程

    在Spring AOP中,切面由通知(advice)和切点(pointcut)定义。 2. 通知(Advice):在特定的连接点上执行的动作,例如方法调用前、后或者异常发生时。 3. 切点(Pointcut):定义了通知将在何时应用。它可以是一个...

    spring aop jar 包

    在Spring AOP中,切面由通知(Advice)和切点(Pointcut)定义。 2. **通知(Advice)**:通知是在特定连接点(Join Point)执行的代码,例如方法调用前、后或者异常发生时。Spring AOP支持五种类型的通知:前置...

    spring切面AOP所使用的jar包

    Spring框架的AOP(面向切面编程)是其核心特性之一,它允许开发者在不修改原有代码的情况下,通过切面来插入额外的功能,比如日志记录、事务管理、性能监控等。在Spring AOP中,主要涉及到两个重要的库:...

    Spring AOP 建立一个简单的切面及测试

    ### Spring AOP 实现简单切面及测试 #### 一、引言 在软件开发过程中,经常遇到一些横切关注点的问题,例如日志记录、性能监控等,这些功能往往贯穿于应用程序的多个模块中。面向切面编程(Aspect Oriented ...

    spring AOP依赖三个jar包

    AspectJ提供了一种强大的面向切面编程语言,可以定义切点(pointcut)、通知(advice)和连接点(join point)。通过这个jar包,Spring AOP能够支持AspectJ的语法和特性,使得AOP表达更加灵活和强大。 3. spring-...

    spring-aop实例

    在Spring AOP中,切面由两个主要部分组成:通知(advice)和切点(pointcut)。 2. **通知(Advice)**:通知是在特定的连接点(join point)执行的代码,它可以是前置通知(before advice)、后置通知(after ...

    spring aop 附带测试实例

    在Spring AOP中,一个切面通常由一个或多个通知(advises)和一个切点(join point)定义组成。 2. **通知(Advice)**:通知是在特定连接点执行的代码块,例如前置通知(before)、后置通知(after)、环绕通知...

    SPRING AOP详细培训视频

    在Spring AOP中,我们可以使用注解或者XML配置来定义切面、通知和切点。例如,`@Aspect`注解用于标记一个类作为切面,`@Before`、`@After`等用于标记通知,`@Pointcut`用于定义切点表达式。 视频教程中提到的"AOP...

    spring aop 学习笔记

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和抽象化的方法来处理系统中的交叉关注点,如日志、事务管理、安全性等。本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际...

    spring aop所需jar包

    Spring AOP,即Spring的面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下对程序进行功能增强的技术。在Java应用程序中,AOP主要用于日志记录、性能统计、安全控制、事务管理等...

    基于java的企业级应用开发:Spring AOP简介.ppt

    3. **Pointcut**:切点是连接点的子集,定义了哪些连接点会被切面所关注,也就是切面将在哪些地方起作用。 4. **Advice**:通知是在特定切点执行的代码,也就是增强处理。它定义了在特定连接点要做什么,可以是环绕...

    Spring AOP实现 项目源码 Myeclipse 直接导入可用

    在Spring AOP中,切面可以通过定义一个包含通知(Advice)的类来实现。 2. **通知(Advice)**: 通知是在特定连接点(Join Point)执行的代码,包括前置通知、后置通知、异常通知、最终通知和环绕通知。例如,你...

    Spring基础:Spring AOP简单使用

    创建一个简单的Spring AOP应用,首先定义一个切面类,包含切点和通知,然后在Spring配置文件中启用AOP并注册切面,最后编写测试类验证AOP功能是否正常工作。 8. **最佳实践** - 适度使用AOP,过多的切面可能导致...

    第3章 Spring AOP.ppt

    Spring AOP,全称为Spring面向切面编程,是Java EE企业级应用开发中的一个重要组成部分。它提供了一种在不改变原有代码的情况下,通过添加额外功能(如日志、事务管理)来增强程序的能力。AOP的主要目标是解决传统...

    SpringAop的简单理解.pdf

    SpringAOP通过使用动态代理技术,实现对目标对象方法调用的拦截,并根据切面定义的切点将增强应用到相应的连接点上。开发者只需要编写切面逻辑,无需修改业务代码,可以更清晰地分离关注点,并提高代码的复用性和可...

    spring aop jar

    AOP的核心概念包括切面、通知、连接点、切点、织入等,使得我们可以优雅地实现日志记录、事务管理、性能监控等功能。在使用Spring AOP时,确实需要依赖一些特定的库,这些库在描述中已经提及: 1. **aspectjrt.jar*...

    利用SPring AOP配置切面的一个例子

    ### Spring AOP 配置切面实例解析 #### 一、引言 本文将通过一个具体的例子来介绍如何在Spring框架中使用面向切面编程(Aspect Oriented Programming, AOP)。我们将关注如何定义一个切面(Aspect),以及如何在...

    SpringAOP简单项目实现

    总结,这个"SpringAOP简单项目实现"涵盖了Spring AOP的基础知识,包括切面、通知、切入点的定义与配置,以及如何在实际项目中使用Maven进行构建和依赖管理。对于初学者来说,这是一个很好的实践案例,能够帮助他们...

    Spring AOP需要的jar

    在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它提供了众多功能,包括依赖注入、面向切面编程(AOP)等。本文将详细介绍在使用Spring AOP时所需的两个关键jar包:aopalliance-1.0.jar和aspectjweaver-...

    Spring切面AOP编程的简单模拟实现

    我们将讨论以下几个核心概念:切面、通知、连接点和代理。 首先,我们要理解什么是切面。在AOP中,切面是关注点的模块化,它结合了“横切关注点”(如日志、安全检查)与业务逻辑。在Spring中,我们可以通过定义一...

Global site tag (gtag.js) - Google Analytics