ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产精品亚洲人一区二区三区,亚洲一区二区三区视频播放,精品一区二区亚洲http://www.aygfsteel.com/caoqingsong/archive/2006/08/11/63018.html曚w’æ?/dc:creator>曚w’æ?/author>Fri, 11 Aug 2006 07:43:00 GMThttp://www.aygfsteel.com/caoqingsong/archive/2006/08/11/63018.htmlhttp://www.aygfsteel.com/caoqingsong/comments/63018.htmlhttp://www.aygfsteel.com/caoqingsong/archive/2006/08/11/63018.html#Feedback0http://www.aygfsteel.com/caoqingsong/comments/commentRss/63018.htmlhttp://www.aygfsteel.com/caoqingsong/services/trackbacks/63018.html Ioc模式

  分离å…Ïx³¨åQ?Separation of Concerns : SOCåQ‰æ˜¯Ioc模式和AOP产生最原始动力åQŒé€šè¿‡åŠŸèƒ½åˆ†è§£å¯å¾—åˆ°å…³æ³¨ç‚¹åQŒè¿™äº›å…³æ³¨å¯ä»¥æ˜¯ ¾l„äšgComponents, æ–šw¢Aspects或服务Servicesã€?/p>

  从GoF设计模式中,我们已经习惯一¿Uæ€ç»´¾~–程方式åQšInterface Driven Design 接口驱动åQŒæŽ¥å£é©±åŠ¨æœ‰å¾ˆå¤šå¥½å¤„åQŒå¯ä»¥æä¾›ä¸åŒçµ‹zȝš„子类实现åQŒå¢žåŠ ä»£ç ç¨³å®šå’Œå¥å£®æ€§ç­‰½{‰ï¼Œä½†æ˜¯æŽ¥å£ä¸€å®šæ˜¯éœ€è¦å®žçŽ°çš„åQŒä¹Ÿž®±æ˜¯å¦‚下语句˜qŸæ—©è¦æ‰§è¡Œï¼š

  AInterface a = new AInterfaceImp();

  AInterfaceImp是接口AInterface的一个子¾c»ï¼ŒIoc模式可以延缓接口的实玎ͼŒæ ÒŽ(gu¨©)®éœ€è¦å®žçŽŽÍ¼Œæœ‰ä¸ªæ¯”å–»åQšæŽ¥å£å¦‚åŒç©ºçš„æ¨¡åž‹å¥—åQŒåœ¨å¿…要æ—Óž¼Œéœ€è¦å‘模型套注ž®„石膏,˜q™æ ·æ‰èƒ½æˆäؓ一个模型实体,因此åQŒæˆ‘们将äºÞZؓ控制接口的实现成ä¸?注射"ã€?/p>

  Ioc英文ä¸?Inversion of ControlåQŒå³åè{模式åQŒè¿™é‡Œæœ‰è‘—名的好莱坞理论åQšä½ å‘†ç€åˆ«åЍåQŒåˆ°æ—¶æˆ‘会找你ã€?/p>

  其实Ioc模式也是解决调用者和被调用者之间的一¿Uå…³¾p»ï¼Œä¸Šè¿°AInterface实现语句表明当前是在调用被调用者AInterfaceImpåQŒç”±äºŽè¢«è°ƒç”¨è€…名¿U°å†™å…¥äº†è°ƒç”¨è€…的代码中,˜q™äñ”生了一个接口实现的原罪åQšå½¼æ­¤è”¾p»ï¼Œè°ƒç”¨è€…和被调用者有紧密联系åQŒåœ¨UML中是用依èµ?Dependency 表示ã€?/p>

  但是˜q™ç§ä¾èµ–在分¼›Õd…³æ³¨çš„æ€ç»´ä¸‹æ˜¯ä¸å¯å¿è€çš„åQŒå¿…™åÕdˆ‡å‰ÔŒ¼Œå®žçŽ°è°ƒç”¨è€…å’Œè¢«è°ƒç”¨è€…è§£è€¦ï¼Œæ–°çš„Ioc模式 Dependency Injection 模式由此产生了, Dependency Injection模式是依赖注ž®„的意思,也就是将依赖先剥¼›»ï¼Œç„¶åŽåœ¨é€‚当时候再注射˜q›å…¥ã€?/p>

Ioc模式åQˆDependency Injection模式åQ‰æœ‰ä¸‰ç§åQ?/p>

½W¬ä¸€¿Uç±»åž?从JNDI或ServiceManager½{‰èŽ·å¾—è¢«è°ƒç”¨è€…ï¼Œ˜q™é‡Œ¾cÖM¼¼ServiceLocator模式ã€?1. EJB/J2EE
2. AvalonåQˆApache的一个复杂ä‹É用不多的™å¹ç›®åQ?
½W¬äºŒ¿Uç±»åž?使用JavaBeansçš„setteræ–ÒŽ(gu¨©)³• 1. Spring Framework,
2. WebWork/XWork
½W¬ä¸‰¿Uç±»åž?在构造方法中实现依赖 1. PicoContainer,
2. HiveMind

  有过EJB开发经验的人都知道åQŒæ¯ä¸ªEJB的调用都需要通过JNDIå¯ÀL‰¾åˆ°å·¥åŽ‚æ€§è´¨çš„Home接口åQŒåœ¨æˆ‘的教程EJB是什么章节中åQŒæˆ‘也是从依赖和工厂模式角度来阐˜q°EJBçš„ä‹É用ã€?/p>

  在通常传统情况下,ä¸ÞZº†å®žçŽ°è°ƒç”¨è€…å’Œè¢«è°ƒç”¨è€…è§£è€¦ï¼Œåˆ†ç¦»åQŒä¸€èˆ¬æ˜¯é€šè¿‡å·¥åŽ‚æ¨¡å¼å®žçŽ°çš„ï¼Œä¸‹é¢ž®†é€šè¿‡æ¯”较工厂模式和Ioc模式不同åQŒåŠ æ·Þq†è§£Ioc模式ã€?/p>

工厂模式和Ioc
  假设有两个类B å’?CåQšBä½œäØ“è°ƒç”¨è€…ï¼ŒC是被调用者,在B代码中存在对C的调用:

public class B{
   private C comp;
  ......
}
 

  实现comp实例有两¿Ué€”径åQšå•态工厂模式和Iocã€?/p>

工厂模式实现如下åQ?/p>

public class B{
   private C comp;
  private final static MyFactory myFactory = MyFactory.getInstance();

  public B(){
    this.comp = myFactory.createInstanceOfC();

  }
   public void someMethod(){
    this.comp.sayHello();
  }
  ......
}
 

特点åQ?/p>

每次˜qè¡Œæ—Óž¼ŒMyFactory可根据配¾|®æ–‡ä»¶XML中定义的C子类实现åQŒé€šè¿‡createInstanceOfC()生成C的具体实例ã€?
使用Ioc依赖性注ž®? Dependency Injection )实现Picocontainer如下åQŒB¾cÕd¦‚同通常POJO¾c»ï¼Œå¦‚下åQ?/p>

public class B{
   private C comp;
  public B(C comp){
    this.comp = comp;
   }
   public void someMethod(){
    this.comp.sayHello();
   }
  ......
}
 

假设C接口/¾cÀLœ‰æœ‰ä¸€ä¸ªå…·ä½“实现CImp¾c…R€‚当客户端调用Bæ—Óž¼Œä½¿ç”¨ä¸‹åˆ—代码åQ?/p>

public class client{
   public static void main( String[] args ) {
    DefaultPicoContainer container = new DefaultPicoContainer();
    container.registerComponentImplementation(CImp.class);
    container.registerComponentImplementation(B.class);
    B b = (B) container.getComponentInstance(B.class);
    b.someMethod();
   }
}
 

  因此åQŒå½“客户端调用Bæ—Óž¼Œåˆ†åˆ«ä½¿ç”¨å·¥åŽ‚æ¨¡å¼å’ŒIoc有不同的特点和区别:

  主要区别体现在B¾cȝš„代码åQŒå¦‚æžœä‹É用IocåQŒåœ¨B¾cÖM»£ç ä¸­ž®†ä¸éœ€è¦åµŒå…¥ä“Qä½•å·¥åŽ‚æ¨¡å¼ç­‰çš„ä»£ç ï¼Œå› äØ“˜q™äº›å·¥åŽ‚æ¨¡å¼å…¶å®ž˜q˜æ˜¯ä¸ŽC有些间接的联¾p»ï¼Œ˜q™æ ·åQŒä‹É用Iocå½Õdº•解耦了Bå’ŒC之间的联¾p…R€?/p>

  使用Ioc带来的代ä»äh˜¯åQšéœ€è¦åœ¨å®¢æˆ·ç«¯æˆ–其它某处˜q›è¡ŒBå’ŒC之间联系的组装ã€?/p>

  所以,Iocòq¶æ²¡æœ‰æ¶ˆé™¤Bå’ŒC之间˜q™æ ·çš„联¾p»ï¼Œåªæ˜¯è½¬ç§»äº†è¿™¿Uè”¾p…R€?br />  ˜q™ç§è”系转移实际也是一¿Uåˆ†¼›Õd…³æ³¨ï¼Œå®ƒçš„影响巨大åQŒå®ƒæä¾›äº†AOP实现的可能ã€?/p>

Iocå’ŒAOP
  AOP我们已经知道是一¿Ué¢å‘切面的¾~–程方式åQŒç”±äºŽIoc解放自由了B¾c»ï¼Œè€Œä¸”可以向B(t¨¤i)¾cÕd®žçŽ°æ³¨ž®„C¾cÕd…·ä½“实玎ͼŒå¦‚果把B¾cÀLƒ³åƒæˆ˜qè¡Œæ—¶çš„æ¨ªå‘动作åQŒæ— ç–‘注入C¾cÕd­¾cÕd°±æ˜¯AOP中的一¿UAdvice

  通过下列代码说明如何使用Picocontainer实现AOPåQŒè¯¥ä¾‹ç¨‹ä¸»è¦å®žçŽ°æ˜¯è®°å½•logger功能åQŒé€šè¿‡Picocontainer可以使用½Ž€å•一行,使所有的应用¾cȝš„记录功能‹È€‹z…R€?/p>

首先¾~–制一个记录接口:

public interface Logging {

  public void enableLogging(Log log);

}
 

有一个LogSwitcher¾c»ï¼Œä¸»è¦ç”¨æ¥‹È€‹zÕd…·ä½“应用中的记录功能:

import org.apache.commons.logging.Log;
public class LogSwitcher
{
  protected Log m_log;
  public void enableLogging(Log log) {
    m_log = log;
    m_log.info("Logging Enabled");
  }
}

一般的普通应用JavaBeans都可以ç‘ô承这个类åQŒå‡è®¾PicoUserManager是一个用æˆïL®¡ç†ç±»åQŒä»£ç å¦‚下:

public class PicoUserManager extends LogSwitcher
{
  ..... //用户½Ž¡ç†åŠŸèƒ½
}
public class PicoXXXX1Manager extends LogSwitcher
{

  ..... //业务功能
}
public class PicoXXXX2Manager extends LogSwitcher
{

  ..... //业务功能
}
 

注意LogSwitcher中Log实例是由外界赋予的,也就是说卛_°†è¢«å¤–界注ž®„进入,下面看看使用Picocontainer是如何注ž®„Log的具体实例的ã€?/p>


DefaultPicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(PicoUserManager.class);
container.registerComponentImplementation(PicoXXXX1Manager.class);
container.registerComponentImplementation(PicoXXXX2Manager.class);
.....

Logging logging = (Logging) container.getComponentMulticaster();

logging.enableLogging(new SimpleLog("pico"));//‹È€‹z»log


 

  ç”׃¸Šä»£ç å¯è§åQŒé€šè¿‡ä½¿ç”¨½Ž€å•一行logging.enableLogging()æ–ÒŽ(gu¨©)³•使所有的应用¾cȝš„记录功能‹È€‹z…R€‚这是不是类似AOPçš„advice实现åQ?/p>

  æ€ÖM¹‹åQŒä‹É用Ioc模式åQŒå¯ä»¥ä¸½Ž¡å°†æ¥å…·ä½“实玎ͼŒå®Œå…¨åœ¨ä¸€ä¸ªæŠ½è±¡å±‚‹Æ¡è¿›è¡Œæ˜q°å’ŒæŠ€æœ¯æž¶æž„,因此åQŒIoc模式可以为容器、框架之¾cȝš„软äšg实现提供了具体的实现手段åQŒå±žäºŽæž¶æž„技术中一¿Ué‡è¦çš„æ¨¡å¼åº”用ã€?/p>

]]>
åŸÞZºŽJ2EE轻量¾U§æž¶æž„的多层应用的研½I?/title><link>http://www.aygfsteel.com/caoqingsong/archive/2006/06/16/53158.html</link><dc:creator>曚w’æ?/dc:creator><author>曚w’æ?/author><pubDate>Fri, 16 Jun 2006 01:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/caoqingsong/archive/2006/06/16/53158.html</guid><wfw:comment>http://www.aygfsteel.com/caoqingsong/comments/53158.html</wfw:comment><comments>http://www.aygfsteel.com/caoqingsong/archive/2006/06/16/53158.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/caoqingsong/comments/commentRss/53158.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/caoqingsong/services/trackbacks/53158.html</trackback:ping><description><![CDATA[     摘要: 摘Â?è¦?     目前 J2EE 应用中,普遍使用了多层架构。本文提å‡ÞZº†åŸÞZºŽ J2EE 的轻量çñ”多层架构åQŒå³ä¸šç•Œæ¯”较成熟çš? Stru...  <a href='http://www.aygfsteel.com/caoqingsong/archive/2006/06/16/53158.html'>阅读全文</a><img src ="http://www.aygfsteel.com/caoqingsong/aggbug/53158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/caoqingsong/" target="_blank">曚w’æ?/a> 2006-06-16 09:52 <a href="http://www.aygfsteel.com/caoqingsong/archive/2006/06/16/53158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">ÍÁÄ¬ÌØÓÒÆì</a>| <a href="http://" target="_blank">ºáÉ½ÏØ</a>| <a href="http://" target="_blank">ͨÓÜÏØ</a>| <a href="http://" target="_blank">Û³ÁêÏØ</a>| <a href="http://" target="_blank">ò£ÉÏÏØ</a>| <a href="http://" target="_blank">Ì©À´ÏØ</a>| <a href="http://" target="_blank">°ºÈÊÏØ</a>| <a href="http://" target="_blank">¹«°²ÏØ</a>| <a href="http://" target="_blank">·ö·çÏØ</a>| <a href="http://" target="_blank">ÍþÄþ</a>| <a href="http://" target="_blank">ÎߺþÏØ</a>| <a href="http://" target="_blank">ÖñÉ½ÏØ</a>| <a href="http://" target="_blank">ÁÙ·ÚÊÐ</a>| <a href="http://" target="_blank">¼ÎÏéÏØ</a>| <a href="http://" target="_blank">ÎäÆ½ÏØ</a>| <a href="http://" target="_blank">ÁÖµéÏØ</a>| <a href="http://" target="_blank">Äþ½òÏØ</a>| <a href="http://" target="_blank">ÕÄÆÖÏØ</a>| <a href="http://" target="_blank">Èð²ýÊÐ</a>| <a href="http://" target="_blank">ÉÛÎäÊÐ</a>| <a href="http://" target="_blank">¶õ¶û¶à˹ÊÐ</a>| <a href="http://" target="_blank">¿µÆ½ÏØ</a>| <a href="http://" target="_blank">»ô³ÇÏØ</a>| <a href="http://" target="_blank">²ÔÏªÏØ</a>| <a href="http://" target="_blank">À¼Î÷ÏØ</a>| <a href="http://" target="_blank">ÖζàÏØ</a>| <a href="http://" target="_blank">½¨ê±ÊÐ</a>| <a href="http://" target="_blank">³¤°×</a>| <a href="http://" target="_blank">»³¼¯ÏØ</a>| <a href="http://" target="_blank">¶þÁ¬ºÆÌØÊÐ</a>| <a href="http://" target="_blank">Âí¹«ÊÐ</a>| <a href="http://" target="_blank">Ñ×ÁêÏØ</a>| <a href="http://" target="_blank">ÐÂÖñÏØ</a>| <a href="http://" target="_blank">Æß̨ºÓÊÐ</a>| <a href="http://" target="_blank">ÑôÎ÷ÏØ</a>| <a href="http://" target="_blank">ÓÀÐËÏØ</a>| <a href="http://" target="_blank">¹ãÖÝÊÐ</a>| <a href="http://" target="_blank">°²ÐÂÏØ</a>| <a href="http://" target="_blank">¹àÄÏÏØ</a>| <a href="http://" target="_blank">ºâÑôÏØ</a>| <a href="http://" target="_blank">¶«Æ½ÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>