AspectJ 入门篇

来源:互联网 发布:脸部干燥怎么补水 知乎 编辑:程序博客网 时间:2024/06/06 02:17

 

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);
    }

    
}

 这个例子中用到了AspectJ的部分的关键字和名词:方面(Aspect)、切入点、连接点、通知等。将会在下篇文章中给大家一一介绍。