<aspect>
<pointcut-def type="method"
pattern="* example.*Servlet.doGet(..)"/>
<bind-advice pointcut="all">
<advice-ref/>
</bind-advice>
</aspect>
下面我们一行一行地分析这段代码:
⑴ 我们创建了一个叫做servlet的aspect。如有必要,我们可以创建任意数量的aspect。
⑵ 在第二行,我们创建了一个叫做all的point-cut,它只适用于方法(type="method")。
⑶ 第三行我们用一个正则表达式规定了把advice应用到哪里。在这个例子中,我们指出应用advice的条件是:不管返回值的类型是什么(第一个“*”),名称以servlet结尾(*servlet)且包含一个带任意参数的doGet方法(doGet(..))的example包里面的类。
⑷ 在第四行,我们告诉Aspectwerkz编译器要把后面的advice应用到所有的point-cut。
⑸ 在这里我们声明要使用的advice是persist。
现在我们知道了如何映射point-cut与advice创建出aspect,下面来看看一个提供advice的类的实例。在映射文件中,我们注册了一个example.PersistenceAdvice类型的advice,下面是该类型的源代码:
package example;
import javax.servlet.http.*;
import org.codehaus.aspectwerkz.advice.*;
import org.codehaus.aspectwerkz.joinpoint.*;
public class PersistenceAdvice extends AroundAdvice {
public PersistenceAdvice() {
super();
}
public Object execute(final JoinPoint joinPoint)
throws Throwable {
MethodJoinPoint jp =(MethodJoinPoint) joinPoint;
final Object result = joinPoint.proceed();
Object[] parameters = jp.getParameters();
if (parameters[0] instanceof HttpServletRequest) {
HttpServletRequest request =(HttpServletRequest) parameters[0];
if (request.getAttribute("person") != null) {
Person contact =(Person) request.getAttribute("person");
ContactManager persistent = new ContactManager();
String fileName =(request.getRealPath("https://www.jb51.net/")+"contacts.txt");
persistent.save(contact, fileName);
}
}
return result;
}
}
execute()方法的第一行很容易理解,就是尽量把它定型成最具体的类型,第二行或许是最重要的:因为我们想要运行该方法并检查结果,所以必须调用proceed()。在下一部份,我们捕获HttpServletRequest,提取由Servlet放入的对象(记住,此时doGet()方法己运行结束)。
最后,我们创建一个名称为ContactManager的类,它的功能是把Person的数据保存到一个文本文件。实际上,要把数据保存到XML文件、数据库或其它持久化存储机制也很方便。
这里需要掌握的一点是,在设计应用或建立原型的阶段,Servlet并不知道未来会发生什么变化,第二阶段的功能可以随时加入,正因为如此,所以我们说应用程序能够在发展过程中学习新的能力,以后要添加新的功能非常方便。
【结束语】 我们在前面的例子中试验了一个简单的应用,将它部署到Tomcat,并用浏览器运行和测试它的功能。虽然这个应用本身并无任何实际用途,但它示范和证实了一些非常有用的概念。想象一下,你将可以快速地建立原型,完成后再引入安全、日志、持久化、缓冲之类的Cross-cutting concern。不管原始应用的规模有多大,你将能够在十分钟之内轻松地为整个应用加入日志功能!
希望你能够超越本文的简单例子,去看看如何在自己的项目中采用AOP技术。熟悉AOP的概念当然需要一定的时间,但肯定会得到回报,对于一个中等规模的项目,它会让你省下数星期时间,或者少写数千行重复的代码。
您可能感兴趣的文章: