by agate - Published: 2008-01-26 [12:09 下午] - Category: 程序编码
连续写了两次AOP的文章,总是觉得没有吧AOP说得很清楚。而且网络上每一篇AOP的教程都是充斥着大量专业术语,令人甚是费解。打算把各个术语根据spring这个aop的实现来串讲一边。
还是从“日志记录说起吧”,几乎我们所有的程序中都需要记录日志的,这是一个共通的需求。
如果我们要把日志记录提取出来,作为一个抽象的独立的服务我们可以叫它为 Advice (“通知”,说白了,advice就是一个功能逻辑)。
然后我们将这个“功能逻辑 ”-advice 加入到我们需要的地方,而这个地方就是我们所谓的 PointCut ,(“切入点”,我们使用中最常看到的就无非是:方法前、方法后、出异常时等等)。
重复上一篇文章的话:我们的 Aspect = Advice + PointCut 这样我们就形成了我们AOP最为基础“切面”
那么我们要把这个 advice 加在哪里呢?也就是说这个PointCut在哪里呢?这个就是我们所谓的 Target (“目标对象”)。我们的目标说白了也就是目标对象中的某些需要我们这个日志服务的方法罢了。
OK,我们有了我们的“通知”、“切入点”,也有了我们的“目标对象”,那么将“通知”加入到“目标对象”的“切入点”的动作就叫 weaving (“织入”)。呵呵,这个当然是有spring容器在运行时执行的咯,但是多我们来说就是在applicationContext.xml中加入对应的配置段咯。
这里,还有一个名词 Proxy (“代理对象”),如何理解这个词呢?它在实际使用中又是什么呢?我为此特别画了一张图:

所谓 Proxy 这个代理,说白了,在 Spring 的 AOP 应用中,就是将你那些需要插入服务的目标对象在一个新的、模拟好你这些目标对象的现有方法接口的一个新的对象。正如我画的这个图所示,其实在程序运行过程中我们使用的比不是我们自己设计出来的那个“DiyBean”,而是由 Spring 容器自动生成的一个对象“DiyBeanProxy”。我们调用的那些被声明配置过的方法时,也不是用我们对象默认的方法,而是根据配置的不同,重新生成的代理对象中的对应方法。就比如我们这图中的“methodTwo()”方法,代理对象中的(1)、(2)方法段其实就是对应着的就是切入点的功能啦,(1)就是等于“beforeMethod”,(2)就是相应的“afterMethod”了(当然还有在抛出异常的时候的服务我没有画出)。
综合来说,AOP不是什么特新的思想,就是我们一切业内的术语过于专业、抽象。不就是一个拦截,一个重新打包的过程嘛!不难!
by agate - Published: 2008-01-19 [10:44 下午] - Category: 程序编码
近日一直沉醉在 O'REILLY 的群书中,记了不少学习笔记,受益匪浅。在看《Spring程序高手秘籍》中看到了译者注释的一段话,很好的(至少比我自己解释的好)。
他是这么说地:
AOP:即为aspect面向程序设计,是 OOP 的一种的补充或改进。
将 OOP 应用到现实世界时,时常发现系统中的各类会有许多共同使用的逻辑或责任(例如日志管理、权限控制、调度处理等) ,这些 “服务” 不断重复地 “切入” 各类中。
如果功能流程是纵向的,这些切入点就是所谓的 point-cut,而在此提供服务的额外程序代码就是所谓的 advice。简而言之,point-cut 与 advice 的组合就成为的 aspect,就是这些共同使用的逻辑或责任的封装。
通过 AOP 可将程序的责任理清,对象与 aspect 互不干扰。另外,aspect 的模组并非显示地为对象所用,而是通过依赖注入或拦截方式获得被封装在对象内部的方法与信息。
by agate - Published: 2007-12-07 [9:41 下午] - Category: 程序编码
其实我的个人表达能力不是很好……估计小时候语文没学好~也可能是aop这个概念本身意会的程度很大吧!呵呵寒暄一下!
正式进入主题:AOP 即 Aspect Oriented Programming 的缩写,中文译为"面向切面编程"。本篇没那么学术化,只是为了快速入门了解真实的使用方式!我们不用那么早去想这个名词的意义,fellow me,用真实的代码透析AOP的含义。
不知各位有没有项目开发的经验,如果有的话你应该可以清楚地了解到我们的代码中常常充斥着大量的日志记录代码,我们用log4j等日志记录工具一段一段地记录程序运行的信息。也许有个别是十分特殊的,但是似乎大部分都是例行公事吧!或者在丢出exception的时候捕获其message然后记入日志对吗?这样的代码难道不觉得碍眼?修改起来是不是也很麻烦?要是我们换了一个日志记录工具怎么办?呵呵,别吓到了,没这么严重啦,这些都是极端情况,平时我们还是很开心地写着这些东西。但是今天要说到的这个aop可以将一些特别的操作提取出来,作为我们的"通知-advice",在运行时加载到对象中。就是说,我们可以在代码中不写日志记录段,但是在运行时加载一些"通知"到需要记录日志的"切入点-pointcut"动态地加入日志记录功能。
Read more...