专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » javaaop:用Java动态代理实现AOP »正文

javaaop:用Java动态代理实现AOP

来源: 发布时间:星期五, 2008年12月19日 浏览:2次 评论:0
目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至也涌现出大量支持AOP优秀Framework,--Spring, JAC, Jboss AOP 等等AOP似乎时的间成了潮流Java初学者不禁要发出感慨OOP还没有学通呢又来AOP本文不是要在理论上具体阐述何为AOP, 为何要进行AOP . 要详细了解学习AOP可以到它老家http://aosd.net去瞧瞧这里只是意图通过个简单例子向初学者展示下如何来进行AOP.   为了简单起见例子没有没有使用任何第 3方AOP Framework, 而是利用Java语言本身自带动态代理功能来实现AOP.   让我们先回到AOP本身AOP主要应用于日志记录性能统计安全控制,事务处理等方面主要意图就要将日志记录性能统计安全控制等等代码从商业逻辑代码中清楚划分出来我们可以把这些行为个单独看作系统所要解决问题就是所谓面向问题编程(不知将AOP译作面向问题编程是否欠妥)通过对这些行为分离我们希望可以将它们独立地配置到商业思路方法中而要改变这些行为也不需要影响到商业思路方法代码   假设系统由系列BusinessObject所完成业务逻辑功能系统要求在每次业务逻辑处理时要做日志记录这里我们略去具体业务逻辑代码 public erface BusinessInterface {  public void processBusiness; } public BusinessObject implements BusinessInterface {  private Logger logger = Logger.getLogger(this.getClass.getName);  public void processBusiness{   try {    logger.info("start to processing...");    //business logic here.    .out.prln(“here is business logic”);    logger.info("end processing...");   } catch (Exception e){    logger.info("exception happends...");    //exception handling   }  } }   这里处理商业逻辑代码和日志记录代码混合在这给日后维护带来困难并且也会造成大量代码重复完全相同log代码将出现在系统个BusinessObject中 按照AOP思想我们应该把日志记录代码分离出来要将这些代码分离就涉及到个问题我们必须知道商业逻辑代码何时被这样我们好插入日志记录代码般来说要截获个思路方法我们可以采用回调思路方法或者动态代理动态代理般要更加灵活目前多数AOP Framework也大都采用了动态代理来实现这里我们也采用动态代理作为例子   JDK1.2以后提供了动态代理支持员通过实现java.lang.reflect.InvocationHandler接口提供个执行处理器然后通过java.lang.reflect.Proxy得到个代理对象通过这个代理对象来执行商业思路方法,在商业思路方法被同时执行处理器会被自动   有了JDK这种支持我们所要做仅仅是提供个日志处理器 public 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.   }    o;  } }   现在我们可以把BusinessObject里面所有日志处理代码全部去掉了 public BusinessObject implements BusinessInterface {  private Logger logger = Logger.getLogger(this.getClass.getName);  public void processBusiness{   //business processing   .out.prln(“here is business logic”);  } }   客户端商业思路方法代码如下: BusinessInterface businessImp = BusinessObject; InvocationHandler handler = LogHandler(businessImp); BusinessInterface proxy = (BusinessInterface) Proxy.ProxyInstance(  businessImp.getClass.getClassLoader,  businessImp.getClass.getInterfaces,  handler); proxy.processBusiness;   输出如下: INFO: method stats... here is business logic INFO: method ends...   至此我们次小尝试算是完成了可以看到采用AOP的后日志记录和业务逻辑代码完全分开了以后要改变日志记录话只需要修改日志记录处理器就行了而业务对象本身(BusinessObject)无需做任何修改并且这个日志记录不会造成重复代码了所有商业处理对象都可以重用这个日志处理器   当然在实际应用中这个例子就显得太粗糙了由于JDK动态代理并没有直接支持次注册多个InvocationHandler那么我们对业务处理思路方法既要日志记录又要性能统计时就需要自己做些变通了般我们可以自己定义个Handler接口然后维护个队列存放所有Handler, 当InvocationHandler被触发时候我们依次自己Handler所幸是目前几乎所有AOP Framework都对这方面提供了很好支持.这里推荐大家使用Spring

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: