<%@ page contentType="text/html; charset=gb2312"%> 用Java动态代理实现AOP
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
用Java动态代理实现AOP
     发布者: 发布时间:2006-10-04
目前整个开发社区对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代码将出现在系统的每一个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”);
 }
}

  客户端调用商业方法的代码如下:

BusinessInterface businessImp = new BusinessObject();

InvocationHandler handler = new LogHandler(businessImp);

BusinessInterface proxy = (BusinessInterface) Proxy.newProxyInstance(
 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。
(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
Java企业应用系统框架的比较与选择
Java Web项目开发到底需要掌握哪些技术?
线程基础---wait(),notify的应用一例
基于JDK5.0的一些Thread总结
编写JUnit测试的理由和几条测试习惯
两种Java容器类List和Set分析
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(1849)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(5861)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(1406)
        
Milton
3a192a4b6f304024ed7ee5727b5dc900 http://wwf-sito.enadzh.biz/ http://villaggi-san-vito.tzlnou.biz/ http://video-sesso-fra-animale-gratis.kajgdw.biz/ http://skintek-green-733.ygvhik.biz/ http://scuole-danza-classica.ygvhik.biz/ http://riforma-lutero-1500.tzlnou.biz/ http://le-origini-della-lingua-francese.ygvhik.biz/ http://malga-ciapela-neve.iuatju.biz/ http://villa-stile-inglese.ygvhik.biz/ http://mascarpone-crema.ppdpwx.biz/ 69fae163d26a9b1682339a4eb6fc4ad9
        
Scott
47a61b4d3b89ed48ac9e36fc71fb8e97 http://mosca-trasporto-frigo.hdpwsk.org/ http://il-parabrezza.mnkcbe.org/ http://piastra-imetec-bellissima-b200.hdpwsk.org/ http://insieme-rivista-mamma.vywyuh.org/ http://concorso-o-s-s-campania.hdpwsk.org/ http://calendario-and-max-and-2007.cqhnnx.org/ http://link-http-antifinley-forum-free.hdpwsk.org/ http://titolo-poesia.vywyuh.org/ http://dividere-audio-divx.hdpwsk.org/ http://libro-addestramento-cane.pvaeyo.org/ eb89aa2351bfb8dd061b0dc25061dcdb
        
Kai
a8f374fdb92a3ecf74a95d4cef3b2dbd EmmanuelDewindt EmilianoCarney ExumAlexis EmilianoCarney UlshGabriel LeonardoBaskerville ElliotWeise AaronCeleste JorgeDuhn WolffDominique 1bb5907b91a875f331998f8e4f2b0572
        
Carey
43e8c14e12081774cfe0d5eac04bb876 napoletano francesco configurare outlook per yahoo mail scrittore italiano contemporaneo shakespeare roma schiavo d abruzzo spiagge abruzzo nosferatu silvio evangelista gravidanza gemellare settimana settimana hotel quattro stella chicago metodo naturale concepire figlio maschio certificato abn b8fb7d84153cc5c69600cbe1497734b2
        
Jeremy
2b6423bd91399e1249bbfc1fb78ff5a0 http://manuale-d-uso-nokia-6125.miwcjz.com/ http://strada-itinerario.miwcjz.com/ http://esecuzione-ostaggio.vbglda.com/ http://napoli-offerta.licoxi.in/ http://anteprima-cadillac-bls.miwcjz.com/ http://blue-tooth-nokia-vivavoce.miwcjz.com/ http://massaggio-salerno.vbglda.com/ http://nome-testo-tutti-uccello-mondo.licoxi.in/ http://porcellana-terzo-fuoco.bkqryo.com/ http://figurine-lavazza.kmyeyh.com/ b8a12f78e2ab8d9c8e5e94f78e975725
        
Jamal
http://c209a5247812309640c6cc83d8a78d1f-t.xkktxb.org c209a5247812309640c6cc83d8a78d1f [url]http://c209a5247812309640c6cc83d8a78d1f-b1.xkktxb.org[/url] [url=http://c209a5247812309640c6cc83d8a78d1f-b2.xkktxb.org]c209a5247812309640c6cc83d8a78d1f[/url] [u]http://c209a5247812309640c6cc83d8a78d1f-b3.xkktxb.org[/u] 8d1f2bfe3cbc5359328d95464cab8b7c
        
Wyatt
89302130841c2c364144be32b6944162 munizione colombacci matrimoniali rumene esterno in pietra intervento ghiandole salivari musica a napoli cover musicali corso guida turistica roma codice facile meliconi erotismo matura montepaschi serit di palermo 8ea4fcdde1a965ef95e68187f350c6f6
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号