zoukankan      html  css  js  c++  java
  • Spring AOP(通知、连接点、切点、切面)

    一、AOP术语

    1. 通知(Advice)
        切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
      5种通知类型:

    前置通知(Before):在目标方法被调用之前调用通知功能
    后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
    返回通知(After-returning):在目标方法成功执行之后调用通知
    异常通知(After-throwing):在目标方法抛出异常后调用通知
    环绕通知(Around):通知包裹了被通知的方法,在被通知的方
    法调用之前和之后执行自定义的行为

    后置通知和返回通知的区别是,后置通知是不管方法是否有异常,都会执行该通知;而返回通知是方法正常结束时才会执行。

    1. 连接点(Join point)
        连接点是在应用执行过程中能够插入切面的一个点。
    2. 切点(Pointcut)
        一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。因此,切点其实就是定义了需要执行在哪些连接点上执行通知。
    3. 切面(Aspect)
        切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和在何处完成其功能。
    4. 引入(Introduction)
        引入允许我们向现有的类添加新方法或属性。
    5. 织入(Weaving)
        织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有很多个点可以进行织入:

    编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
    类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器,它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ 5的加载时织入就支持这种方式织入切面。
    运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象。Spring AOP就是以这种方式织入切面的。

    二、Spring对AOP的支持

      创建切点来定义切面所织入的连接点是AOP框架的基本功能。Spring提供了4种类型的AOP支持:

    • 基于代理的经典Spring AOP;
    • 纯POJO切面
    • @AspectJ注解驱动的切面
    • 注入式AspectJ切面(适用于Spring各版本)

    前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。

    1.Spring在运行时通知对象

    通过在代理类中包裹切面,Spring在运行期把切面织入到Spring管理的bean中。如下图所示,代理类封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean。当代理拦截到方法调用时,在调用目标bean方法之前,会执行切面逻辑。

    直到应用需要被代理的bean时,Spring才创建代理对象。如果使用的是ApplicationContext的话,在Applicationcontext从Beanfactory中加载所有bean的时候,Spring才会创建被代理的对象。因为Spring运行时才创建代理对象,所以我们不需要特殊的编译器来织入Spring AOP的切面。

    2.Spring只支持方法级别的连接点

    因为Spring基于动态代理,所以Spring只支持方法连接点。这与一些其他的AOP框架是不用的,例如AspectJ和JBoss,除了方法切点,它们还提供了字段和构造器接入点。

    三、通过切点来选择连接点

    以下是Spring AOP所支持的AspectJ切点指示器

    AspectJ指示器描述
    arg() 限制连接点匹配参数为指定类型的执行方法
    @args() 限制连接点匹配参数由指定注解标注的执行方法
    execution() 用于匹配是连接点的执行方法
    this() 限制连接点匹配AOP代理的bean引用为指定类型的类
    target 限制连接点匹配目标对象为指定类型的类
    @target 限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解
    within() 限制连接点匹配指定的类型
    @within() 限制连接点匹配指定注解所标注的类型(当使用Spring AOP时,方法定义在由指定的注解所标注的类里)
    @annotation 限定匹配带有指定注解的连接点
      1. 编写切点

        2.定义切面
  • 相关阅读:
    sourcenav安装
    vim-addon-manager【转】
    zmq重点
    一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。
    微软验证码项目 Captcha Code Demo 从 .NET Core 1.1.2升级到2.1.0
    海康设备如何接入萤石开放平台
    ABP 启用多租户实现数据隔离
    Docker 开发者常用操作命令
    .NET Core 深度克隆对象,引用类型的平行世界
    详解 .NET Core 遍历 List 并移除项
  • 原文地址:https://www.cnblogs.com/sandea/p/11175834.html
Copyright © 2011-2022 走看看