2005年一月月 发布的文章

关注,AOP

AOP的核心概念是关注点,我开始关注AOP。

一、Why AOP?
a) AOP一般观点
一般在开发系统时,我们可以大致的把系统的需求分类为核心模块级需求和系统级需求。很多系统级需求一般来说是相互独立的,但它们一般都会横切许多核心级模块。以一个电信领域的短信网关系统为例,系统的核心级需求是短信的收发,话单处理等,而其系统级的需求包括日志,校验以及性能问题等。像日志这种系统级的需求就横切短信收发、话单处理等几乎所有网关核心级需求。虽然横切需求会跨越多个模块,但目前的技术倾向于使用一维的方法学来处理这种横切需求,把对应需求的实现强行限制在一维的空间里。这个一维空间就是核心模块级实现,其他横切需求的实现被嵌入在这个占统治地位的空间,换句话说,需求空间是一个n维空间,而实现空间是一维空间,这种不匹配导致了糟糕的需求到实现的映射。

b) AOP开发过程
AOP(面向方面的编程方式)将上面所述的横切需求和核心需求都通通称为关注点(concerns)。AOP认为每一个复杂的系统都可以看作是由多个关注点来组合实现的。在这样的情况下,利用AOP开发系统的过程就变成了“识别关注点”(方面分解)—〉“实现关注点”—〉“组装关注点”(方面的重组,又叫织入)。

二、AOP和OOP
a)  AOP作为OOP的补充,它提供了另外一种考量程序结构(program structure)的方式。OO将系统分解成一系列具有继承体系关系的objects;而AOP则将系统分解为aspects or concerns。而且AOP可更好地将一些横切concerns模块化,便于复用和维护。

b)  AOP,从其本质上讲,使你可以用一种松散耦合的方式来实现独立的关注点,然后,组合这些松散耦合的、模块化实现的横切关注点来搭建系统。与之对照,用OOP建立的系统则是用松散耦合的模块化实现的一般关注点来实现的。在AOP中,这些良好模块化的横切关注点的实现单元叫方面(aspect),而在OOP中,这些一般关注点的实现单元叫做类(class)。

c)  在AOP里,每个关注点的实现并不知道是否有其它关注点关注它,这是AOP和OOP的主要区别,在AOP里,组合的流向是从横切关注点到核心关注点,而OOP则恰恰相反。

d)  感觉AOP是在OOP后对那些objects重新分类的过程,将被广泛关注的objects(即横切于多个objects中的objects)提取出来,加工后再重新和原来核心objects组合起来。

三、AOP基本概念

下面是一些AOP基本概念的解释,摘录自AspectJ的FAQ和Spring AOP的Online book:
a)  Aspect(方面): A modularization of a concern for which the implementation might otherwise cut across multiple objects。

b)  Joinpoint(连接点): Join points are well-defined points in the execution of a program. Not every execution point is a join point: only those points that can be used in a disciplined and principled manner are。

c)  Advice(通知): Advice is code that executes at each join point picked out by a pointcut There are three kinds of advice: before advice, around advice and after advice. As their names suggest, before advice runs before the join point executes; around advice executes before and after the join point; and after advice executes after the join point. The power of advice comes from the advice being able to access values in the execution context of a pointcut.

d)  Pointcut(横切点): A set of joinpoints specifying when an advice should fire. An AOP framework must allow developers to specify pointcuts: for example, using regular expressions.  A pointcut picks out join points . These join points are described by the pointcut declaration. Pointcuts can be defined in classes or in aspects, and can be named or be anonymous.

e)  Weaving(织入):将Aspects组装成为最终系统。这个织入过程可以在编译期完成,也可以在运行时完成。

我想我们可以如下图理解AOP:
|———————————–|
|        pointcut         |
|    |————————|   |
|    |    advice1      |   |
|    |    |————–|  |   |
|    |    | jointpoint1|  |   |
|    |    |————–|  |   |
|    |                |   |
|    |————————|   |
|                        |
|    |————————|   |
|    |    advice2      |   |
|    |    |————–|  |   |
|    |    | jointpoint2|  |   |
|    |    |————–|  |   |
|    |                |   |
|    |————————|   |
|    …….                |
|————————————|

Boost_1_32_0版源代码编译

著名的C++准标准库boost在2004年末发布了1.32.0版本,作为C++的忠实Fans怎能“袖手旁观”,趁闲暇时download it and build it。[注]:由于没有公司Unix服务器的管理员权限,所以只能在自己的Windows平台上编译了。

1、前提
a) 下载Boost_1_32_0源码包(http://sourceforge.net/project/showfiles.php?group_id=7586 ),由于在Windows平台下编译,我们可以选择下载boost_1_32_0.exe文件;
b) 安装Windows下的GCC版本(这里我们使用开源的GCC作为编译工具,因为其Free),我选择了MinGW-3.2.0-rc-3(http://sourceforge.net/forum/forum.php?forum_id=438862 );
c) 下载Boost专用build工具bjam,在Windows平台下我们可以得到已经编译好的bjam.exe(http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941 ),你可以  下载boost-jam-3.1.10-1-ntx86.zip文件。

2、目录结构
a) 运行下载后的boost_1_32_0.exe文件,选择解压缩到的目录即可。如D:\boost_1_32_0;
b) 将下载的bjam.exe拷贝到上述目录中。

3、设置环境变量
a) 由于默认情况下,MinGW会安装在C:\MinGW下,一旦你选择其他目录,你就需要自己设置Path。将%Your_MinGW_Install_Path%\bin加入到你的系统Path变量中。

4、Build
在命令行下进入到boost源码包存放的目录,如D:\boost_1_32_0,然后运行:
bjam “-sTOOLS=gcc” install

编译由此开始,如果你的系统没有装Python相关的东东,在编译的最开始会提示你一些warnings,无须理它,让它继续吧!默认的boost安装路径为C:\boost,我们这里采用默认路径。

5、Build结果
编译的过程是漫长的(一般配置的机器2小时左右),需要你耐心的等待。
编译后结果:在C:\Boost下生成两个文件夹include和lib,在D:\ boost_1_32_0中则多了一个bin目录。

6、应用boost
a) 设置boost库
如果你使用的IDE(比如Microsoft Visual Studio或者MinGW Developer Studio(http://petra.hos.u-szeged.hu/~aking/www.parinya.ca/download/MinGWStudioFullSetupPlus-2.05.exe )),你可以在IDE的include和lib路径中直接设置boost库的位置。如果你用的是命令行工具,对于复杂的项目构建估计你需要写你自己的Makefile了。
b) 使用boost的例子
//HelloBoost.cpp
#include
#include
#include
using namespace std;
using namespace boost;

int main()
{   
    string s = "Hello Boost,This is a test";
    tokenizer tok(s);
    for(tokenizer::iterator beg=tok.begin(); beg != tok.end(); ++beg)
    {
        cout << *beg << "\n";
    }
}
//Compile: g++ -o HelloBoost.exe HelloBoost.cpp -I"C:\Boost\include\boost-1_32"

//output:
Hello
Boost
This
is
a
test

现在你可以尽情去研究boost,体会它的无比强大了。

Hello,AOP

论坛上有人评价Java在过去的2004有两大值得称赞的技术发展,一个是Java在IOC模式上的成熟应用,再就是Java的AOP框架。

一、好消息
2005年一月份传来好消息,AspectJAspectWerkz合力打造AOP框架,两个开发团队将合力开发一个全新的面向方面编程(Aspect-Oriented Programming,AOP)平台,在其中融合双方的长处和经验。这两家都是业界重要的开源AOP实现,不过走了不同的技术路线:AspectJ一直坚持“预编译+源码生成”,AspectWerkz则是“元数据+运行时织入”的代表。关于两种技术路线、两种产品的争论一直是AOP社群的热点话题,如今两个开源组织决定彻底解决这个困扰。两家合并之后的第一个产品将是AspectJ 5,其中既有AspectJ风格的、基于语言扩展的AOP,也有AspectWerkz风格的、基于XML(和JSR-175 annotation)的AOP。随后,双方还会继续融合各自的长处和经验,努力提供一个完善而统一的AOP平台。

下载了AspectJ和AspectWerkz,并分别看了一下各自的FAQ,得到2点结论:
- 现在的AOP技术走势是动态织入;
- AspectWerkz没有添加新的语法之类的东西,它使用的是标准的Java语法,上手简单,而AspectJ则构建一套自己的特殊语法,上手不易。

所以在对AOP进行感性认识的阶段,我更倾向于使用AspectWerkz。

二、Hello AOP!
其实每个人在学习一门新的语言或技术的时候,都会经历一个“成就感驱动的”的学习过程。拿C为例,几乎每个初学者都会在几乎不懂任何C语法的情况下,照猫画虎地写出一个“Hello World”程序来。Why? Because he/she needs this feeling!如果连这样的一个小小的程序都运行不起来或者说出现满屏的错误,初学者的心理就会受到很大影响,也可能这个学习过程会就此结束。OK!作为一个AOP的初学者,我们也来个“Hello AOP”,使用AspectWerkz。

上面已经提到,AspectWerkz使用标准Java语法,只要你学过Java,you have got the passport of the first gate to AOP。

* 搭建AOP环境
 - 下载AspectWerkz包(http://aspectwerkz.codehaus.org/index-aw.html )后解压到一个目录(假设为D:\aw_2_0_2),然后设置环境变量ASPECTWERKZ_HOME=D:\ aw_2_0_2。
 - 设置PATH环境变量
PATH=%ASPECTWERKZ_HOME%\bin
 - 设置CLASSPATH环境变量
CLASSPATH=%ASPECTWERKZ_HOME%\lib\aspectwerkz-2.0.RC2.jar;%ASPECTWERKZ_HOME%\lib\aspectwerkz-jdk14-2.0.RC2.jar;%ASPECTWERKZ_HOME%\lib\dom4j-1.4.jar;%ASPECTWERKZ_HOME%\lib\qdox-1.4.jar;%ASPECTWERKZ_HOME%\lib\concurrent-1.3.1.jar;%ASPECTWERKZ_HOME%\lib\trove-1.0.2.jar;%ASPECTWERKZ_HOME%\lib\jrexx-1.1.1.jar;%CLASSPATH%

* 开始AOP
1)这里我们要在屏幕打印出“Hello AOP!”,看如下代码:
//HelloAOP.java
public class HelloAOP {
    public static void main(String args[]) {
        HelloAOP ha = new HelloAOP();
        ha.test();
    }
    public void test() {
        System.out.println("Hello AOP!");
    }
}
编译HelloAOP.java文件:javac HelloAOP.java

2)现在我要在输出“Hello AOP!”前后做一些工作,这些工作在运行时会得到调用机会,如果使用AOP术语,我们可以说我们要编写我们的aspect,这个aspect会在运行时被weave into (织入)HelloAOP class。

//MyAspect.java
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;
public class MyAspect {
    public void beforeTesting(JoinPoint joinPoint) {
        System.out.println("before testing…");
    }
    public void afterTesting(JoinPoint joinPoint) {
        System.out.println("after testing…");
    }
}
javac MyAspect.java

3)织入过程并不简单,我们需要撰写一个描述文件来将aspect和其织入的class中的信息联系起来。
//aop.xml

   
       
               
               
               
       
   

4)run it
aspectwerkz -Daspectwerkz.definition.file=aop.xml HelloAOP

//output:
before testing…
Hello AOP!
after testing…

Everything is Perfect!




这里是Tony Bai的个人Blog,欢迎访问、订阅和留言!订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您喜欢通过微信App浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:



本站Powered by Digital Ocean VPS。

选择Digital Ocean VPS主机,即可获得10美元现金充值,可免费使用两个月哟!

著名主机提供商Linode 10$优惠码:linode10,在这里注册即可免费获得。

阿里云推荐码:1WFZ0V立享9折!

View Tony Bai's profile on LinkedIn


文章

评论

  • 正在加载...

分类

标签

归档











更多