您的位置:首页 > 编程语言 > ASP

主题:AspectJ的一个简单例子

2010-04-22 10:12 381 查看
AspectJ
是一个特定于java语言的面向方面编程语言。官方网站是 http://www.eclipse.org/aspectj/


AspectJ已经很成熟,并且有一个成熟的编辑工具:AJDT
(eclipse插件)

下面介绍一个AspectJ的简单例子,从而对AspectJ有一个直观的认识:

在面向对象语言中,我们一般用一个类处理一个关注点的需求。

但是在很多情况下,类不仅要处理自己的关注点,还必须满足另一个关注点的需求。

也就是说类被系统中的多个关注点横切了.

在类中多种关注点的混合将会导致代码分散
和代码纠缠
的发生。

代码分散
是指处理一个关注点所需的代码会分散到处理其他关注点的类中。

代码纠缠
是指利用一个类或方法实现了系统中的多个关注点。

下面是一个People类:

Java代码
public class People {
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}


public class People {
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}


这个类实现了系统中People数据对象的类模型。我们把它称为主要关注点。

但是现在出现了一个新的需求,就是对所有People对象的属性访问都要记录日志。

即一个次要关注点(横切关注点):对所有People对象的属性访问都要记录日志。

下面是将次要关注点直接编码到People类的代码:

Java代码
public class People {
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
<span style="color: rgb(255, 0, 0);" mce_style="color: #ff0000;"><i>System.out.println(">>> Log : modify people's attribute ...");</i>
</span>
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
<span style="color: rgb(255, 0, 0);" mce_style="color: #ff0000;"><i>System.out.println(">>> Log : modify people's attribute ...");</i>
</span>
this.age = age;
}
}


public class People {
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
System.out.println(">>> Log : modify people's attribute ...");

this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println(">>> Log : modify people's attribute ...");

this.age = age;
}
}


虽然People类实现了日志功能,不过日志关注点的代码分散到了实现People类模型的代码中(代码分散),而且People

类实现了多个关注点(代码纠缠)。这样对代码的修改于维护都是很不利的。

现在我们利用AspectJ来将这两个关注点分离。下面是AspectJ代码:

Java代码
public aspect PeopleAspect {
pointcut setXXX():
call(public void People.set*(*));

before():setXXX(){
System.out.println(">>> Log : modify people's attribute ...");
}
}


利用AspectJ编译器编译AspectJ程序和第一个People类(即将AspectJ程序织入到第一个People类中),

然后运行下面的主程序测试:

Java代码
public static void main(String[] args){
People p = new People();
p.setAge(24);
p.setName("Tom");
}


控制台输出如下:

>>> Log : modify people's attribute ...

>>> Log : modify people's attribute ...

我们发现同样实现了日志功能,而且程序结构更加清晰。

AspectJ的语法类似于Java的语法,不过有一些特殊的关键字,关于它的更多内容请参见AspectJ官方文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: