AspectJ是AOP领域的较早的实现。AspectJ是在java语言基础上进行扩充的一门语言,扩充了自定义的关键字;并提供了自己的编译器ajc;在本文和接下来的系列文章中,将会与大家共同学习AspectJ这么新的AOP语言。下面的一个例子,是学习AspectJ的典型例子。如果是第一次看到该段代码,可能看不懂,不过没关系;在接下来的系列文章中,我将和大家共同学习。
通常我们在记录日志时候,都是硬编码在我们的业务代码中,下面的一个方面提供了当在应用中发生异常的时候,可以自动的在方面记录日志;而不用在业务代码中硬编码。随着日志规则的变化或者需要增加或者删除日志记录的情况,我们可以通过方面来实现松耦合!
在例子的代码中,基本上都作了比较完整的注释,将不会在文档中对例子做过多的介绍。
/** */
/**
*
*/
package com.liuxiang.aspectj;
import org.apache.log4j.Logger;
/** */ /**
*
* 日志记录和跟踪是 AOP 的经典学习练习。
*
* 方面是对日志记录和跟踪的传统方法的重大改进。在某些情况下 编写方面来解决这些普通问题很简单。
* 对于比较复杂的情况,则需要对象和方面之间的更多合作,这最好在稍后的学习阶段去尝试。
* 跟踪方面可以帮助初学者了解不熟悉的程序部分如何工作,并在调试间歇出现的问题时获得更深的理解。
*
* 每当程序从模型调用中返回一个异常时,该方面就记录错误。
* 这种方法对于跟踪 “吞下” 异常(即,捕获异常却不处理)的代码中的异常也十分有用。
*
* LogModelExceptions.aj
* com.liuxiang.aspectj.a
* Aspectj5Project
* @author liuxiang mailto:juxtapose@163.com
* 2007-7-22 上午10:15:27
*
*/
public aspect LogExceptions ... {
private Logger logger = Logger.getLogger("LogModelExceptions");
/** *//**
* 切入点:包com.liuxiang及子包中所有公共方法的调用
*/
public pointcut recordlog():call(public * com.liuxiang..*(..));
public pointcut recordlog1():call(public * com.liuxiang..*(..));
/** *//**
* 在切入点recordlog()中所有发生异常的地方,将会触发如下的after操作,记录日志
*/
after() throwing(Exception e):recordlog()...{
logger.error("Error in calling method", e);
}
}
*
*/
package com.liuxiang.aspectj;
import org.apache.log4j.Logger;
/** */ /**
*
* 日志记录和跟踪是 AOP 的经典学习练习。
*
* 方面是对日志记录和跟踪的传统方法的重大改进。在某些情况下 编写方面来解决这些普通问题很简单。
* 对于比较复杂的情况,则需要对象和方面之间的更多合作,这最好在稍后的学习阶段去尝试。
* 跟踪方面可以帮助初学者了解不熟悉的程序部分如何工作,并在调试间歇出现的问题时获得更深的理解。
*
* 每当程序从模型调用中返回一个异常时,该方面就记录错误。
* 这种方法对于跟踪 “吞下” 异常(即,捕获异常却不处理)的代码中的异常也十分有用。
*
* LogModelExceptions.aj
* com.liuxiang.aspectj.a
* Aspectj5Project
* @author liuxiang mailto:juxtapose@163.com
* 2007-7-22 上午10:15:27
*
*/
public aspect LogExceptions ... {
private Logger logger = Logger.getLogger("LogModelExceptions");
/** *//**
* 切入点:包com.liuxiang及子包中所有公共方法的调用
*/
public pointcut recordlog():call(public * com.liuxiang..*(..));
public pointcut recordlog1():call(public * com.liuxiang..*(..));
/** *//**
* 在切入点recordlog()中所有发生异常的地方,将会触发如下的after操作,记录日志
*/
after() throwing(Exception e):recordlog()...{
logger.error("Error in calling method", e);
}
}
这个例子中用到了AspectJ的部分的关键字和名词:方面(Aspect)、切入点、连接点、通知等。将会在下篇文章中给大家一一介绍。