background image

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”);
  }
  }
 
  客户端调用商业方法的代码如下: