spring-第十六篇之AOP面向切面编程之Spring AOP
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的更多相关文章
- spring-第十五篇之AOP面向切面编程之AspectJ框架简单应用
1.去官方网站下载aspectj-1.8.0.jar 2.在jar包目录启动cmd,执行java -jar aspectj-1.8.0.jar,Next 3.检查JAVA_HOME路径是否正确,如果不 ...
- Spring 08: AOP面向切面编程 + 手写AOP框架
核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...
- 特性attribute,声明和使用attribute,应用attribute,AOP面向切面,多种方式实现AOP
1 特性attribute,和注释有什么区别2 声明和使用attribute3 应用attribute4 AOP面向切面5 多种方式实现AOP ---------------------------- ...
- C#使用KingAOP实现AOP面向切面编程一
AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 实现AOP主要由两种方式,一种是编译时静态植入,优点是 ...
- Spring-05 -AOP [面向切面编程] -Schema-based 实现aop的步骤
一.AOP [知识点详解] AOP:中文名称面向切面编程 英文名称:(Aspect Oriented Programming) 正常程序执行流程都是纵向执行流程 3.1 又叫面向切面编程,在原有纵向执 ...
- 面向切面编程之cglib代理方式
思想: 和上一篇面向切面编程之手动JDK代理方式上的需求和开发模式一样.不同的是目标类没有接口,只有实现类,采用的是spring中提供的Enhancer类继承目标类实现的代理方式. 需要导入的jar包 ...
- spring总结————AOP面向切面总结
spring总结————AOP面向切面 一.spring aop概念 spring aop面向切面编程,java是面向对象的语言. 真正的service层代码 业务逻辑层再处理业务之前和之后都要进行一 ...
- [转] AOP面向切面编程
AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- Spring Boot2(六):使用Spring Boot整合AOP面向切面编程
一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop aop全称Aspec ...
随机推荐
- thinkphp5.0.19 表单令牌
助手函数token() [F:\phpStudy\WWW\csweb\thinkphp\helper.php] request类token()方法 [F:\phpStudy\WWW\csweb\thi ...
- 开发框架DevExtreme全新发布v19.1.3|附下载
DevExtreme Complete Subscription是性能最优的 HTML5,CSS 和 JavaScript 移动.Web开发框架,可以直接在Visual Studio集成开发环境,构建 ...
- Linux安装配置varnish web加速器
Linux安装配置varnish web加速器 Varnish是一款高性能的开源HTTP加速器,它可以来做纯粹的代理服务器,负载均衡,但varnish最主要的功能是缓存加速,也是它最出色的 ...
- github上.md的编写
# algs4 一:大标题 =========== 二:中标题 ------------ 三:1~6级标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 # ...
- sql2008 误操作还原至指定时间点
--drop database db --创建一个测试库 create database db go --备份一个完整备份文件 backup database db to disk = 'd:\db. ...
- Java——常用类(基础类型数据包装类)
[包装类] 包装类(如Integer.Double等)这些类封装了一个相应的基础数据类型数值,并为其提供了一系列操作. 例如:java.lang.Integer类提供了以下构造方法: ...
- Acvitivi网关(十一)
1排他网关 1.1 什么是排他网关 排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策. 当流程执行到这个网关,所有分支都会判断条件是否为 true,如果为 true 则 ...
- CopyOnWrite 个人理解以及应用
缘由 最近在看<Redis 设计与实现>,看到Redis的执行bgsave生成dump.rdb是根据CopyOnWrite的 之前也不是很懂为啥要有CopyOnWrite这个东西 翻看文章 ...
- LOJ504「LibreOJ β Round」ZQC 的手办
https://loj.ac/problem/504 题解 对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了. 如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中 ...
- Oracle Between子句
Oracle Between子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,您将学习如何使用Oracle BETWEEN运算符来选择值在一 ...