1、上一篇介绍了AspectJ在AOP的简单应用,让我们了解到它的作用就是:开发者无需修改源代码,但又可以为这些组件的方法添加新的功能。

AOP的实现可分为两类(根据AOP修改源码的时机划分)

1>静态AOP实现:AOP框架在编译阶段对程序进行修改,即实现目标类的增强,生成静态的AOP代理类(生成的.class文件已经被修改,需要特定的编译器)。以AspectJ为例,所以AspectJ通常也被称作编译时增强的AOP框架。静态代理因经过编译后,所以性能上略有优势,但需要特殊的编译器。

2>动态AOP实现:AOP框架在运行阶段动态生成AOP代理(在内存中)以实现对目标类的增强。典型的有JDK动态生成代理类、cglib动态生成代理类。

2、spring AOP

spring AOP是动态代理的代表,生成的代理类要么与目标类实现相同的接口,要么是目标类的子类,前者使用的是JDK代理的代理策略,后者使用的是cglib代理的处理策略。spring中的AOP代理由spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。spring默认使用java动态代理来创建AOP代理。spring也可以使用cglib代理,在需要代理类而不是代理接口的时候,spring会自动切换为使用cglib代理。

3、面向切面编程中的一些术语:

切面(Aspect):或者称为切面类,切面用于组织多个Advice(增强处理),Advice放在切面中定义。如aspectjTest项目中的TxAspect.java。

连接点(JoinPoint):程序执行过程中明确的程序执行点,如方法的调用,或者异常抛出点。spring AOP中,连接点总是方法的调用,即围绕着方法调用点。如aspectjTest项目中的连接点表达式。例如aspectjTest项目中如下代码:

pointcut xxxPointcut():execution(* com.lfy.bean.*.*(..));

增强处理(Advice):AOP框架在特定的切入点执行的增强处理。如aspectjTest项目“模拟进行权限检查”的处理代码。处理类型有before、around、after等类型。

切入点(Pointcut):可以插入增强处理(Advice)的连接点。换言之,当某个连接点满足指定的执行点条件要求时,该连接点将被插入增强处理,该连接点也就变成了切入点。每个方法被调用都只是连接点,但该方法属于某个连接点增强处理配置的匹配项,则该方法将被增强处理,该连接点也就变成了切入点,增强了也就是切入了。

如何使用表达式来定义切入点是AOP的核心,spring默认使用AspectJ的切入点语法。

引入:将方法或字段增强到被处理的类中。spring允许将新的接口引入到任何被处理的对象中。例如,可以将一个新接口引入到任何需要被增强的对象中。

目标对象:需要被AOP框架增强的对象。如果AOP框架采用的是动态AOP实现,那么该对象也称作被代理的对象。

AOP代理:被AOP框架(静态/动态)增强后的对象。spring中的AOP代理可以是JDK动态代理,也可以是cglib动态代理,前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。

织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程。织入有两种实现方式--编译时增强(如AspectJ)和运行时增强(如spring AOP)。

4、spring对AOP的支持

spring目前仅支持将方法调用作为连接点(joinpoint),如果需要对成员变量的访问和更新也作为增强处理的连接点,则可以考虑使用AspectJ。

一般开发人员进行AOP开发的步骤有如下3个部分:

1>定义普通业务组件。

2>定义切入点,一个切入点可能横切多个业务组件。

3>定义增强处理,增强处理就是AOP框架为普通业务组件织入(Weaving)的处理业务。

完成切入点的定义以及增强处理的定义,也就完成了AOP的编程,AOP框架将会自动的根据我们的切入点以及增强处理生成AOP代理。

目前高于spring-1.x版本的spring提供2种方式定义切入点和增强处理:

1>基于注解的“零配置”方式:使用@Aspect、@Pointcut等注解来标注切入点和增强处理。

2>基于XML配置文件的管理方式:使用spring配置文件来定义切入点和增强处理。

spring-第十六篇之AOP面向切面编程之Spring AOP的更多相关文章

  1. spring-第十五篇之AOP面向切面编程之AspectJ框架简单应用

    1.去官方网站下载aspectj-1.8.0.jar 2.在jar包目录启动cmd,执行java -jar aspectj-1.8.0.jar,Next 3.检查JAVA_HOME路径是否正确,如果不 ...

  2. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  3. 特性attribute,声明和使用attribute,应用attribute,AOP面向切面,多种方式实现AOP

    1 特性attribute,和注释有什么区别2 声明和使用attribute3 应用attribute4 AOP面向切面5 多种方式实现AOP ---------------------------- ...

  4. C#使用KingAOP实现AOP面向切面编程一

    AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 实现AOP主要由两种方式,一种是编译时静态植入,优点是 ...

  5. Spring-05 -AOP [面向切面编程] -Schema-based 实现aop的步骤

    一.AOP [知识点详解] AOP:中文名称面向切面编程 英文名称:(Aspect Oriented Programming) 正常程序执行流程都是纵向执行流程 3.1 又叫面向切面编程,在原有纵向执 ...

  6. 面向切面编程之cglib代理方式

    思想: 和上一篇面向切面编程之手动JDK代理方式上的需求和开发模式一样.不同的是目标类没有接口,只有实现类,采用的是spring中提供的Enhancer类继承目标类实现的代理方式. 需要导入的jar包 ...

  7. spring总结————AOP面向切面总结

    spring总结————AOP面向切面 一.spring aop概念 spring aop面向切面编程,java是面向对象的语言. 真正的service层代码 业务逻辑层再处理业务之前和之后都要进行一 ...

  8. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  9. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...

随机推荐

  1. 配置本地yum仓库

        前言 我们知道yum工具是基于rpm的,其一个重要的特性就是可以自动解决依赖问题,但是yum的本质依旧是把后缀名.rpm的包下载到本地,然后按次序安装之.但是每次执行yum install x ...

  2. pyserial库-串口通讯模块

    pySerial 封装了串口通讯模块,支持Linux.Windows.BSD(可能支持所有支持POSIX的操作系统),支持Jython(Java)和IconPython(.NET and Mono). ...

  3. extjs计算两个DateField所间隔的月份(天数)

    需求:两个DateField控件,分别为开始时间和结束时间.当选择完结束时间后,自动计算这两个时间段所间隔的月或天数. 需要解决的问题: 1.直接使用Ext.getCmp('endDate').get ...

  4. poj 3613Cow Relays

    Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a rel ...

  5. sh_02_第2个Python程序

    sh_02_第2个Python程序 print("hello")

  6. Codeforces Round #603 (Div. 2)F. Economic Difficulties

    F. Economic Difficulties 题目链接: https://codeforces.com/contest/1263/problem/F 题目大意: 两棵树,都有n个叶子节点,一棵树正 ...

  7. WWDC2017-advanced_animations_with_uikit

    最后修改时间: 2017-12-1 官方视频链接 这个Session主要讲一下的几个内容: Basic(基础的): 动画工作原理 以及 动画如何计时 Interactive and Interrupt ...

  8. 关于 Visual stdio 编译报错:error MSB6006: “CL.exe”已退出

    网上查看,原因有多种. 1,我自己遇到的是这样的: 环境:VS2019,编译项目 image-master,中间自己重整了原来的目录,移动了很多文件.编译报错:error MSB6006: “CL.e ...

  9. 构建嵌入式Linux交叉编译工具链

    开源交叉编译工具链制作方法汇总: 1) 使用crosstool/crosstool-ng生成 2) 使用buildroot生成 ARM交叉编译工具链说明: 1) arm-linux-gcc是一个集合命 ...

  10. First-order logic

    w https://en.wikipedia.org/wiki/First-order_logic