主题:AspectJ的一个简单例子
2010-04-22 10:12
381 查看
AspectJ
是一个特定于java语言的面向方面编程语言。官方网站是 http://www.eclipse.org/aspectj/
。
AspectJ已经很成熟,并且有一个成熟的编辑工具:AJDT
(eclipse插件)
下面介绍一个AspectJ的简单例子,从而对AspectJ有一个直观的认识:
在面向对象语言中,我们一般用一个类处理一个关注点的需求。
但是在很多情况下,类不仅要处理自己的关注点,还必须满足另一个关注点的需求。
也就是说类被系统中的多个关注点横切了.
在类中多种关注点的混合将会导致代码分散
和代码纠缠
的发生。
代码分散
是指处理一个关注点所需的代码会分散到处理其他关注点的类中。
代码纠缠
是指利用一个类或方法实现了系统中的多个关注点。
下面是一个People类:
Java代码
这个类实现了系统中People数据对象的类模型。我们把它称为主要关注点。
但是现在出现了一个新的需求,就是对所有People对象的属性访问都要记录日志。
即一个次要关注点(横切关注点):对所有People对象的属性访问都要记录日志。
下面是将次要关注点直接编码到People类的代码:
Java代码
虽然People类实现了日志功能,不过日志关注点的代码分散到了实现People类模型的代码中(代码分散),而且People
类实现了多个关注点(代码纠缠)。这样对代码的修改于维护都是很不利的。
现在我们利用AspectJ来将这两个关注点分离。下面是AspectJ代码:
Java代码
利用AspectJ编译器编译AspectJ程序和第一个People类(即将AspectJ程序织入到第一个People类中),
然后运行下面的主程序测试:
Java代码
控制台输出如下:
>>> Log : modify people's attribute ...
>>> Log : modify people's attribute ...
我们发现同样实现了日志功能,而且程序结构更加清晰。
AspectJ的语法类似于Java的语法,不过有一些特殊的关键字,关于它的更多内容请参见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官方文档。
相关文章推荐
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- 一个简单的Ant例子
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- 简单说说angularJS和一个经典例子
- 一个简单的优化例子(锁问题)
- wxWidgets一个界面与数据分离的简单例子
- ExpandableListView用法的一个简单小例子
- socket编程——一个简单的例子
- ADO.NET Entity Framework 一个简单数据绑定例子
- 一个简单登录例子
- struts1的一个登录的简单例子
- 一个简单的例子解释obj中key用不用引号的问题
- C# Remoting的一个简单例子
- MOSS CAML(1)基础语法及我开发的一个简单例子
- [MEF插件式开发] 一个简单的例子
- 一个简单的点击后显示与隐藏表格的例子
- 一个简单的多线程例子-互斥量
- Java产生死锁的一个简单例子
- 利用泛型实现一个简单的android orm小例子
- 一个简单的ruby生成器例子(用连续体Continuation实现)