Spring学习之Aop的基本概念
转自:http://my.oschina.net/itblog/blog/209067
AOP的基本概念
AOP从运行的角度考虑程序的流程,提取业务处理过程的切面。AOP面向的是程序运行中的各个步骤,希望以更好的方式来组合业务逻辑的各个步骤。AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定切入点,而不与具体某个类耦合(即在不污染某个类的情况下,处理这个类相关的切点)。下面是一些AOP的一些术语:
切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点通常会横切多个对象,因此常被称为横切关注点
连接点(JoinPoint):程序执行过程中明确的点,如方法调用,或者异常抛出。Spring AOP中,连接点总是方法调用。
增强处理(Advice):AOP框架在特定的切入点执行的增强处理。处理有around,before,after等类型。(说明:AOP是比较前言的只是,而大部分国内翻译人士在翻译计算机文献时,总是一边看各种翻译软件和词典,一边逐字逐句的翻译,而不是先去从总体上把握知识的架构。因此难免导致一些术语翻译的词不达意,在AOP的术语上也存在较大差异,对于Advice一词,有人翻译为“通知”,有人翻译为“建议”......实际上,Advice是指AOP框架在特定切面所加入的某种处理,笔者这里翻译为“增强处理”,希望可以表达出Advice的真正含义)
切入点(PointCut):可以插入增强处理的连接点。简而言之,当某个连接点满足执行要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。例如:
|
1
|
pointcut xxxPointcut():execution(void H*.say*()) |
每个方法被调用都只是连接点,但如果该方法属于H开头的类,且方法名以say开头,按该方法的执行将变成切入点。如何使用表达式来定义切入点是AOP的核心,Spring默认使用AspectJ切入点语法。
引入:将方法或字段添加到被处理的类中。Spring允许引入新的接口到任何被处理的对象
目标对象:被AOP框架进行增强处理的对象,也被称为增强的对象。如果AOP框架是通过运行时代理来实现的,那么这个对象将是一个被代理的对象。
AOP代理:AOP框架创建的对象,简单地说,代理就是对目标的对象的加强。Spring中AOP代理可以是JDK动态代理,也可以是CGLIB代理。前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。
织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程就是织入。织入有两种实现方式:编译时增强(如AspectJ)和运行时增强(如CGLIB)。Spring和其他纯Java AOP框架一样,在运行时织入。
由前面的介绍知道:AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但AOP代理中的方法与目标对象的方法存在差异:AOP方法在特定切入点增加了增强处理,并回调了目标对象的方法。
Spring的AOP支持
Spring中AOP代理由Spring的IoC容器负责生成、管理。其依赖关系也由IoC容器负责管理。因此AOP代理可以直接使用容器中的其他Bean作为目标,这种关系可由IoC容器的依赖注入提供。Spring默认支持使用JDK动态代理来创建AOP代理,这样就可以为任何接口实现创建代理了。
Spring也支持CGLIB代理,在需要代理类而不是代理接口的时候,Spring自动会切换为使用CGLIB代理。但Spring推荐使用面向对象编程,因此业务对象通常都会实现一个或多个接口,此时默认将使用JDK动态代理,但也可以强制使用CGLIB。
Spring AOP使用纯Java实现。它不需要专门的编译过程。Spring AOP不需要控制类装载器的层次,因此它可以在所有JavaWeb容器或应用服务器中运行良好。
Spring目前仅支持将方法调用作为连接点(JoinPoint),如果需要把对Field的访问和更新也作为增强处理(Advice)的连接点,则可以考虑使用AspectJ。
Spring实现AOP框架跟其他的框架不同。Spring并不是要提供最完整的AOP实现(尽管Spring AOP有这个能力),而是侧重于AOP实现和Spring IoC之间的整合,用于帮助解决在企业级开发中的常见问题。因此,Spring通常和IoC容器一起使用,Spring从来就没有大官通过提供一种全面的AOP解决方案来与AspectJ竞争。Spring AOP采用基于代理的AOP实现方案,而AspectJ则采用编译时增强的解决方案。
Spring2.0可以无缝的整合Spring AOP、IoC和AspectJ,是的所有的AOP应用完全融入基于Spring的框架,这样的集成不会影响Spring AOP API或者AOP Alliance API,Spring AOP保持了向下兼容性,依然允许直接使用Spring AOP API来完成AOP编程。
一旦我们掌握了AOP的概念,不难发现进行AOP编程是一件很简单的事情。纵观AOP编程,其实需要程序员参与的只有三个部分:
定义普通的业务组件
定义切入点(PointCut),一个切入点可能横切多个业务组件
定义增强处理(Advice),增强处理及时在AOP框架为普通业务组件织入时的处理动作
第一部分是最为平常的事情了,无需说明。第二、三部分就是AOP的关键:一旦定义了合适的切入点和增强处理,AOP框架将会自动生成代理,而AOP代理的方法大致有如下公式:
代理对象的方法 = 增强处理 + 被代理对象的方法
Spring 1.x采用自身提供的AOP API来定义切入点和增强处理,程序可以直接使用Spring AOP API来定义切入点和增强处理,但这种方式似乎有些过时了,现在通常建议使用AspectJ方式来定义切入点和增强处理,在这种方式下,Spring依然有如下两种选择来定义切入点和增强处理:
基于注解的配置方式:使用@Aspect ,@Pointcut等注解来标注切入点和增强处理
基于XML配置文件的方式
Spring学习之Aop的基本概念的更多相关文章
- Spring学习之AOP的实现方式
Spring学习之AOP的三种实现方式 一.介绍AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能 ...
- Spring学习之AOP总结帖
AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...
- Spring学习笔记一:基础概念
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774310.html 一:Spring是什么 Spring的主要作用是作为对象的容器. 传统编程中,我们 ...
- spring学习(二) ———— AOP之AspectJ框架的使用
前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...
- 8 -- 深入使用Spring -- 4...3 AOP的基本概念
8.4.3 AOP的基本概念 AOP从程序运行角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中各个步骤,希望以更更好的方式来组合业务处理的各个步骤. AOP框架并不与特定的代码耦合 ...
- Spring 学习二-----AOP的原理与简单实践
一.Spring AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...
- Spring学习之==>AOP
一.概述 AOP(Aspect Oriented Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等,Struts2的拦截器设计就是基于A ...
- Spring学习之AOP
Spring-AOP(Aspect-orented programming) 在业务流程中插入与业务无关的逻辑,这样的逻辑称为Cross-cutting concerns,将Crossing-cutt ...
- Spring学习之Aop的各种增强方法
AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的 ...
随机推荐
- 愤怒的DZY(二分)
愤怒的DZY[问题描述]“愤怒的小鸟”如今已经是家喻户晓的游戏了,机智的WJC最近发明了一个类似的新游戏:“愤怒的DZY”.游戏是这样的:玩家有K个DZY,和N个位于不同的整数位置:X1,X2,…,X ...
- 比较两个data日期之间的天数相差
先将字符串转化为Date类型 转化方式参看:http://blog.csdn.net/caoyinghui1986/archive/2008/04/18/2303570.aspx 然后在调用Date. ...
- 分析cocos2d-x在Android上的编译过程(1):cocco2d-x是怎样生成的Android的文件夹结构
当新建完一个cocos2d-x的项目后.进入到项目中的proj.android中,会看到例如以下的文件夹结构 在VS先把它编译,然后导入到Eclipse中,导入完后会看到多了几个文件 watermar ...
- Maven真——聚合和继承(于)
依赖管理 我们谈论继承一个dependencies因素,我们非常easy这个特性被认为是适用于accout-parent于. 子模块account-email和account-persist同一时候依 ...
- iOS-BLE蓝牙开发
Demo地址:WEBlueToothManager 在写这个博客之前,空余时间抽看了近一个月的文档和Demo,系统给的解释很详细,接口也比较实用,唯独有一点,对于设备 的唯一标示,网上众说纷纭,在这里 ...
- Java动态编程---动态代理
java中动态编程用到的技术有:反射(动态代理),javassist和ASM,这几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM,因为Javassist增加了一层抽象.在实现成 ...
- Deep Learning(深度学习)学习笔记整理系列之(七)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- [转]oracle误删数据的恢复
与数据打交道,免不了会误删一些数据,之后还commit了,连回滚的机会都没了,而更糟糕的是你又没有备份,这种事终于在今天被我不幸的遇上了... 唯一一点值得欣慰的是,我删除表记录的时候,时间不长,一天 ...
- MySql级联操作
转自:http://blog.csdn.net/codeforme/article/details/5539454 外键约束对子表的含义: 如果在父表中找不到候选键,则不允许在子表上进行i ...
- mysql errno:13
新装的mysql,创建表时报错误 errno:13,网上查了一下是权限问题.解决方式如下: 到mysql的数据目录下:即启动进程中:--datadir=/data/soft/mysql/mysqlda ...