Aop的发展经理过两个阶段,第一个是静态Aop阶段,第二个是动态Aop阶段。

    静态Aop阶段:作为第一代的Aop,以最初的AspectJ为代表,特点是以相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中,优点是Aspect直接以java字节码的形式编译到java类中,java虚拟机可以像通常一样加载java类运行,不会给系统运行造成任何性能损失。

    动态Aop阶段:作为第二代的Aop,大都通过java语言提供的各种动态特性来实现第一代Aop织入到当前系统的过程,这类产品有:JBoss  AOP,Spring AOP,Naning AOP ,还有就是第一代的AOP产品AspectJ在融合了Aspect Werkz框架之后,成为唯一支持静动态的AOP产品。 优点:灵活易用,和静态Aop最大的不同就是,Aop的注入过程在系统运行开始之后运行,而不是预编译到系统中,而且织入信息大部分采用外部xml,可以动态更改织入逻辑。缺点:带来性能问题,因为大多数Aop的实现都是在类加载或者系统运行期间,采用对系统字节码进行炒作方式来完成Aspect到系统的织入。

    Aop实现机制:  

  1. 动态代理:说有需要织入横切关注点逻辑的模块类都得实现相应的接口,因为动态代理机制只对接口有效,动态代理在运行期间使用反射,相对于编译后的静态类来说,性能稍逊一些
  2. 动态字节码增强:使用asm或者clib等java工具类在程序运行期间,动态构建字节码的class文件,通过动态字节码增强技术,为这些系统模块类生成相应的子类,而将横切逻辑加到这些子类中,让应用程序在执行期间使用的是这些动态生成的子类,从而达到将横切逻辑织入系统的目的。不足: 若类或者方法声明为final的话,则无法对其进行子类化扩展。
  3. java代码生成:早期EJB用得比较多,现在已经基本上不用了。
  4. 自定义类加载器:通过读取外部文件规定的织入规则和必要的信息,在加载class文件期间就可以讲横切逻辑添加到系统模块类的现有逻辑中, 然后将改动后的class交给虚拟机运行。
  5. AOL拓展

  Aop中的术语:

  Joinpoint:在执行Aop功能模块织入到oop的功能模块中时那个执行点称之为JoinPoint。

  较为常见的织入点:

  1. Method Call:当方法调用的时候所处的程序执行点。
  2. Method Call execution :代表的是某个方法内部执行开始时点
  3. Construction Call(构造方法调用):程序执行过程中对某个对象调用其构造方法进行初始化的时点
  4. Constructor Call Execution(构造方法执行):指的是某个对象构造方法内部执行的开始时点。
  5. Field Set (字段设置) 对象的某个属性通过setter哈哈被设置或者直接被设置的时点
  6. 字段获取:对应的是某个对象相应属性被访问的时点
  7. Class initialize(类初始化):指的是类中某些静态类型后再静态块的初始化时点

      这些都是比较常见的joinpoint,其实每一个认为必要的执行时都可以作文joinpoint,但某些位置Aop产品比较难以捕捉。

  Pointcut:是Joinpoint的表述方式。将横切逻辑织入当前系统的过程中,需要产后照pointcut规定的JoinPoint信息。

    pointcut的表述方式:

      1.直接指定joinpoint所在方法名称。

      2.正则表达式

      3.使用指定的pointcut表述语言

  Advice:是单一横切关注点逻辑的载体,他代表将会织入到joinpoint的横切逻辑

      Advice组成的具体形式:

  1. Before Advice :在Joinpoint指定位置之前执行的Advice类型,通常不会中断程序执行流程,但是也可以通过跑出一场的方式来中断流程。
  2. After Advice:在方法回信完成之后调用的advice,又可以细分为三种:after return Advice :当JoinPoint执行流程正常完成后执行;after throwing advice :又称为throw advice,只有在钱JoinPoint执行过程中抛出异常的情况下执行;after finally advice :不管joinpoint处执行流程是正常终止了海仕抛出异常都会执行。
  3. Around Advice对附加其上的Joinpoint进行“包裹”,可以再JoinPoint之前和之后都指定相应的逻辑,甚至于joinpoint中断或者忽略joinpoint处yuanchengxu流程的执行

  Introduction:可以为原有的对象添加新的特征或者行为,Introduction类型的Advice因实现技术的不同,在具体软件环境中可以存在性能差异。

  Aspect:是对系统中的横切关注点逻辑进行模块化封装的Aop概念实体。

  织入和织入器:完成横切关注点逻辑到 系统的最终织入。

          AspectJ有专门的编译器完成织入操作,即ajc,JBoss AOP采用自定义的类加载器来完成最终织入,spring AOP使用一组类来完成最终的织入操作。Proxy Factory类是Spring AOP中最通用的织入器。

  目标对象:符合pointcut所指定的条件,将在织入过程中被织入横切逻辑的对象,称为目标对象(Target Object)

转载于:https://www.cnblogs.com/Qbright/archive/2012/07/23/2599242.html

spring AoP学习 -----AoP的基本概念相关推荐

  1. spring AoP学习 -----AoP织入器ProxyFactory剖析

    spring AOP框架内使用AopFactory对使用的不同的代理实现机制进行适度的抽象, 只对不同的代理实现机制提供相应的实现,spring Aop框架内提供了JDK的动态代理和Cglib的两种机 ...

  2. Spring.NET学习笔记13——AOP的概念(基础篇) Level 200

    上篇我们简单的了解了AOP的应用场景,知道AOP编程的重要性.这篇我们先看一段代码,来开始今天的学习. 回顾与上篇类似的代码:SecurityService类的IsPass判断用户名为"ad ...

  3. Spring AOP 学习笔记

    Spring 的AOP AOP 专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在Java EE应用中,常常通过AOP 来处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存 ...

  4. Spring整体学习笔记-IoC依赖注入-AOP代理-整合Spring-Mybatis

    Spring 简介 行业春天 解决企业级开发的复杂性,使现有的技术更容易使用,本身是个大杂烩,整合了现有的技术框架 不要重复造轮子 SSH:Struct2+Spring+Hibernate SSM:S ...

  5. Spring原理学习系列之三:Spring AOP原理(从源码层面分析)-------上部

    引言 本文是Spring原理分析的第三篇博文,主要阐述Spring AOP相关概念,同时从源码层面分析AOP实现原理.对于AOP原理的理解有利于加深对Spring框架的深入理解.同时我也希望可以探究S ...

  6. 2014-03-11 Spring的学习(3)------面向切面编程(AOP)

    2019独角兽企业重金招聘Python工程师标准>>> 1. AOP概念 首先让我们从一些重要的AOP概念和术语开始.这些术语不是Spring特有的.不过AOP术语并不是特别的直观, ...

  7. 在Intellij上面导入项目 AOP示例项目 AspectJ学习 Spring AoP学习

    为了学习这篇文章里面下载的代码:http://www.cnblogs.com/charlesblc/p/6083687.html 需要用Intellij导入一个已有工程.源文件原始内容也可见:link ...

  8. 动态代理——》AOP —— Spring 中的 AOP||AOP 相关术语||学习 spring 中的 AOP 要明确的事

    AOP 概述 什么是 AOP       AOP:全称是 Aspect Oriented Programming 即:面向切面编程 AOP 的作用及优势 作用: 在程序运行期间,不修改源码对已有方法进 ...

  9. Spring AOP(一) AOP基本概念

    Spring AOP 基本概念 术语 容易理解 举个栗子给大家讲一下代理: 什么是AOP? 基本术语 (1)切面(Aspect) (2) 目标对象(Target) (3) 连接点(JoinPoint) ...

最新文章

  1. 51单片机之定时器/计数器应用实例(方式0、1、2、3)
  2. HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)
  3. 超越kmeans:聚类算法概述
  4. t oracle删除吗,Oracle 11g 手工建库与删库
  5. neu坐标系和xyz坐标系转换_ArcGIS投影坐标系下坐标转换成地理坐标系经纬度
  6. python 逐行读取文件_Python fileinput模块:逐行读取多个文件
  7. 李开复《纽约时报》专栏:美国对中国AI的几大误解
  8. 一个网站 一个域名跟服务器吗,域名服务器与根服务器区别吗
  9. zookeeper保证单一视图
  10. 图书馆占座系统(三)
  11. netty 百度网盘 密码
  12. Matlab绘制圆饼统计图pie的用法详解
  13. 实验题集4:函数R6-1 面积计算器(函数重载) (10 分)
  14. 用计算机弹熊出没,熊出没之熊大快跑2018辅助
  15. java 日程安排_Java实现 LeetCode 731 我的日程安排表 II(二叉树)
  16. js——分享QQ、QQ空间、微信、微博
  17. 打开U盘 提示 服务器无法运行,win10打开u盘提示“系统资源不足 无法完成请求的服务”怎么办...
  18. 81个人脸关键点检测
  19. excel熵值法计算权重_一文讲清楚分散投资(下)——让很多人顿悟的“熵增定律”在投资中的应用...
  20. Python练习册(二)

热门文章

  1. 使用sql服务器发送贺卡_使用Microsoft Word做最后一分钟的节日贺卡
  2. G-PCC点云压缩 tmc3参考软件编解码使用介绍
  3. STM32串口发送16位数组
  4. 《程序员养成记》第7集 珍爱生命远离编程
  5. js传递event参数
  6. android滑动自动吸顶效果,安卓当下最流行的吸顶效果的实现(上)
  7. 打开思维,新年开工一定要元气满满!
  8. 偏态分布的激素水平影响因素分析
  9. 【转】Windows CALLBACK 函数
  10. EVE-NG模拟器安装教程