博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Core Spring】三、AOP
阅读量:5336 次
发布时间:2019-06-15

本文共 1401 字,大约阅读时间需要 4 分钟。

AOP的一些基本概念

  增强(Advice):增强定义了切片做什么和何时做。Spring切片有以下5种增强

    1. Before--增强功能发生在被增强函数调用之前
    2. After--增强功能发生在被增强函数完成后,不管怎样完成(正常推出、抛出异常)
    3. After-returning--增强功能发生在被增强函数成功完成后
    4. After-throwing--增强功能发生在被增强函数抛出异常后
    5. Around--增强包装被增强方法,在被增强函数调用前后提供一些功能

  连接点(Join points):你的应用程序可能有成千上万次机会被增强。这些机会就是连接点。一个连接点是在程序执行过程中切面可以被插入的点。这个点可能是一个方法被调用、一个异常被抛出、甚至一个域(成员变量)被修改。你的切片的代码可以在这些点被插入到应用程序的正常流程中以增加新的行为。

  切入点(Pointcuts):如果增强定义了切片做什么和何时做,那么切入点定义了在了哪里做。一个切入点的定义包括了一个或多个增强可以被织入的连接点。你可以通过显式的类和方法名或者常规的匹配类和方法名模型的表达式来指定连接点。

  切面(Aspects):一个切面是增强和切入点的集合。

  引入(Introductions):引入允许你为某个已有的类增加新的方法或者属性。

  织入(Weaving):织入是一个将切片应用的一个目标对象以创建一个新的代理对象的过程。切片会在特定的连接点被织入到目标对象中。织入可以发生在以下几个目标对象生命周期的节点上。

      • 编译期--切片在目标对象被编译后织入。这需要一个特殊编译器。AspectJ的织入编译器这样织入切片。
      • 类加载期--切片在目标对象被加载进JVM后织入。这需要一个特殊的ClassLoader(在类被引入应用之前增强目标对象的比特码)。AspectJ 5的加载时织入(LTW)支持这种织入方式。
      • 运行时--切片在应用运行的某个时间被织入。通常,AOP容器动态地生成一个代理对象委托目标对象织入切片。这正是Spring AOP的实现方式。

Spring的AOP支持

  并非所有的AOP框架都是一样的,它们可能通过连接点模型的丰富程度不同进行区分,也可能通过织入切片方式不同区分。无论怎样,创建切入点以定义切片织入的连接点的能力是AOP框架的关键。

  Spring对AOP的支持有以下4种方式:

      • Classic Spring proxy-based AOP
      • Pure-POJO aspects
      • @AspectJ annotation-driven aspects
      • Injected AspectJ aspects (available in all versions of Spring)

  前3种方式是Spring自己的实现。Spring通过动态代理实现AOP。因此,Spring AOP受限于方法拦截。

  第一种方式太过成就,已经很少应用,这里不再赘述。

  通过aop命名空间,你可以将pure POJOs变为切片。事实上,这些POJOs仅提供响应切入点调用的方法。不幸地是,这种技术需要XML配置,但是这是一种简单的声明式地将任何对象变为切片的方式。

  Spring仅支持函数形式的连接点。

转载于:https://www.cnblogs.com/m-evan/p/5397329.html

你可能感兴趣的文章
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
较快的maven的settings.xml文件
查看>>
Git之初体验 持续更新
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
Maven之setting.xml配置文件详解
查看>>
SDK目录结构
查看>>
malloc() & free()
查看>>
HDU 2063 过山车
查看>>
高精度1--加法
查看>>
String比较
查看>>
Django之Models
查看>>
CSS 透明度级别 及 背景透明
查看>>
Linux 的 date 日期的使用
查看>>