background image

Java 动态代理实现 AOP 的技术说明

目前整个开发社区对 AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支
持 AOP 的优秀 Framework,--Spring, JAC, Jboss AOP 等等。AOP 似乎一时之间成了潮
流。Java 初学者不禁要发出感慨,OOP 还没有学通呢,又来 AOP。本文不是要在理论上
具 体 阐 述 何 为 AOP,   为 何 要 进 行 AOP .   要 详 细 了 解 学 习 AOP 可 以 到 它 老 家
http://aosd.net 去瞧瞧。这里只是意图通过一个简单的例子向初学者展示一下如何来进
行 AOP.
  为了简单起见,例子没有没有使用任何第三方的 AOP Framework, 而是利用 Java
语言本身自带的动态代理功能来实现 AOP.
  让我们先回到 AOP 本身,AOP 主要应用于日志记录,性能统计,安全控制,事务处

 

理等方面。它的主要意图就要将日志记录,性能统计,安全控制等等代码从 商业逻辑代
码中清楚的划分出来,我们可以把这些行为一个一个单独看作系统所要解决的问题,就
是所谓的面向问题的编程(不知将 AOP

 

译作面向问题的编程是否 欠妥)。通过对这些行为

的分离,我们希望可以将它们独立地配置到商业方法中,而要改变这些行为也不需要影
响到商业方法代码。
  假设系统由一系列的 BusinessObject 所完成业务逻辑功能,系统要求在每一次业
务逻辑处理时要做日志记录。这里我们略去具体的业务逻辑代码。
  public interface BusinessInterface {
  public void processBusiness();
  }
  public class BusinessObject implements BusinessInterface {
  private Logger logger = Logger.getLogger(this.getClass().getName());
  public void processBusiness(){
  try {
  logger.info("start to processing...");
  //business logic here.
 
  System.out.println(“here is business logic”);
  logger.info("end processing...");
  } catch (Exception e){
  logger.info("exception happends...");
  //exception handling
 
  }
  }
  }
 
  这里处理商业逻辑的代码和日志记录代码混合在一起,这给日后的维护带来一定的
困难,并且也会造成大量的代码重复。完全相同的 log 代码将出现在系统的每一个