BusinessObject 中。
按 照 AOP 的思想,我们应该把日志记录代码分离出来。要将这些代码分离就涉及到
一个问题,我们必须知道商业逻辑代码何时被调用,这样我们好插入日志记录代 码。一
般来说要截获一个方法,我们可以采用回调方法或者动态代理。动态代理一般要更加灵活
一些,目前多数的 AOP Framework
也大都采用了动态代 理来实现。这里我们也采用动
态代理作为例子。
JDK1.2 以 后 提 供 了 动 态 代 理 的 支 持 , 程 序 员 通 过 实 现
java.lang.reflect.InvocationHandler 接 口 提 供 一 个 执 行 处 理 器 , 然 后 通 过
java.lang.reflect.Proxy 得到一个代理对象,通过这个代理对象来执行商业方法,在商业
方法被调用的同时,执行处理器会被自动调用。
有了 JDK 的这种支持,我们所要做的仅仅是提供一个日志处理器。
public class LogHandler implements InvocationHandler {
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;
public LogHandler(Object delegate){
this.delegate = delegate;
}
public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
Object o = null;
try {
logger.info("method stats..." + method);
o = method.invoke(delegate,args);
logger.info("method ends..." + method);
} catch (Exception e){
logger.info("Exception happends...");
//excetpion handling.
}
return o;
}
}
现在我们可以把 BusinessObject 里面的所有日志处理代码全部去掉了。
public class BusinessObject implements BusinessInterface {
private Logger logger = Logger.getLogger(this.getClass().getName());
public void processBusiness(){
//business processing
System.out.println(“here is business logic”);
}
}
客户端调用商业方法的代码如下: