ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>瑟瑟在线观看,黄页网站大全在线免费观看,黑人久久a级毛片免费观看http://www.aygfsteel.com/ocean07000814/category/15456.html共同探讨STRUTS#HIBERNATE#SPRING#EJB½{‰æŠ€æœ?/description>zh-cnFri, 02 Mar 2007 03:26:48 GMTFri, 02 Mar 2007 03:26:48 GMT60Ioc容器的革命性优ç‚?è½?http://www.aygfsteel.com/ocean07000814/articles/70690.html非洲ž®ç™½è„?/dc:creator>非洲ž®ç™½è„?/author>Wed, 20 Sep 2006 01:31:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/70690.htmlhttp://www.aygfsteel.com/ocean07000814/comments/70690.htmlhttp://www.aygfsteel.com/ocean07000814/articles/70690.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/70690.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/70690.htmlIoc容器的革命性优ç‚?/h3>

  我们知道åQŒåœ¨Java基本教程中有一个定律告诉我们:所有的对象都必™åÕdˆ›å»ºï¼›æˆ–者说åQšä‹É用对象之前必™åÕdˆ›å»ºï¼Œä½†æ˜¯çŽ°åœ¨æˆ‘ä»¬å¯ä»¥ä¸å¿…ä¸€å®šéµå¾ªè¿™ä¸ªå®šå¾‹äº†åQŒæˆ‘们可以从Ioc容器中直接获得一个对象然后直接ä‹É用,无需事先创徏它们ã€?/p>

  ˜q™ç§å˜é©åQŒå°±å¦‚åŒæˆ‘ä»¬æ— éœ€è€ƒè™‘å¯¹è±¡é”€æ¯ä¸€æ øP¼›å› äØ“Java的垃圑֛žæ”¶æœºåˆ¶å¸®åŠ©æˆ‘ä»¬å®žçŽîCº†å¯¹è±¡é”€æ¯ï¼›çŽ°åœ¨åˆæ— éœ€è€ƒè™‘å¯¹è±¡åˆ›å¾åQŒå¯¹è±¡çš„创徏和销毁都无需考虑了,˜q™ç»™¾~–程带来的媄响是巨大的ã€?/p>

  我们从一个简单例子开始,有一个普通类B代码如下åQ?/p>
public class B implements BI{

    AInfterface a;

    public B(AInfterface a){

      this.a = a

    }

    public void invoke(){

      /** ...*/

    }

}

 

  有两¿Uä‹É用B的方式:

  普通无Ioc容器的调用方�
  BI b = new B(new A());//需要在生成B实例之前 生成A½{‰å®žä¾?br />  b. invoke();

  使用Ioc容器(Jdon框架)的革命调用方式:
  BI b = (BI) WebAppUtil.getService(“b�;
  b. invoke();

  上面两种方式重要区别åQ?br />  前者需要照™å¾B¾cÖM¸­A¾cȝš„实例化,如果B¾cÖM¸­è°ƒç”¨ä¸åªA¾cÖM¸€ä¸ªï¼Œ˜q˜æœ‰æ›´å¤šå…¶ä»–¾cÕd¦‚C/D/E½{‰ç±»åQŒè¿™æ øP¼Œä½ åœ¨ä½¿ç”¨B¾cÀL—¶åQŒè¿˜éœ€è¦ç ”½I¶å…¶ä»–类的创建,如果C/D/E˜q™äº›¾cÖM¸æ˜¯ä½ è‡ªå·±¾~–写åQŒä½ ˜q˜éœ€è¦ç¿»é˜…它们的API说明åQŒç ”½I¶å®ƒä»¬åº”该如何创建?是ä‹É用New ˜q˜æ˜¯å·¥åŽ‚æ¨¡å¼ ˜q˜æ˜¯å•态调用?

  ˜q™æ—¶åQŒä½ ä¼šæ„Ÿå¹ï¼šå“‡ï¼Œæœ‰æ²¡æœ‰æžé”™ï¼Ÿæˆ‘åªä¸è¿‡æ˜¯äØ“äº†ä‹É用B¾cÖM¸­ä¸€ä¸ªå°ž®çš„æ–ÒŽ³•åQŒå°±èŠ±åŽ»æˆ‘è¿™ä¹ˆå¤šæ—‰™—´å’Œç²¾åŠ›ï¼Ÿ

  当我们ä‹É用第二种方式æ—Óž¼Œž®±æ— éœ€èŠ±å¾ˆå¤šç²¾åŠ›å’Œæ—‰™—´è€ƒè™‘A/C/D/E½{‰ç±»çš„创建ã€?/p>

  使用Ioc容器åQŒä½ å†ä¹Ÿä¸å¿…做这些僵化愚蠢的工作了,我们只需从ioc容器中抓取一个类然后直接使用它们ã€?/p>

  当然åQŒåœ¨ä½¿ç”¨ä¹‹å‰åQŒæˆ‘们需要做一个简单的配置åQŒæŠŠä½ å°†æ¥éœ€è¦ä‹É用的¾cÕd…¨éƒ¨å‘Šè¯‰ioc容器åQŒä¾‹å¦?a target="_blank">Jdon框架的ioc容器配置jdonframework.xml如下:

<app>
  <services>
    <pojoService name="b" class="test.B"/>
    <pojoService name="a" class="test.A"/>
    <pojoService name="c" class="test.C"/>

  </services>
</app>

  注意åQšè™½ç„¶B¾cÖM»£ç è°ƒç”¨äº†A¾c?甚至可能调用C½{‰å…¶ä»–ç±»)åQŒä½†æ˜¯åœ¨é…ç½®ä¸­æˆ‘们无需考虑˜q™ç§è°ƒç”¨å…³ç³»ã€‚因此,整个环节我们都无需考虑B¾cÖM¸­æ¶‰åŠå…¶ä»–¾cȝš„调用关系åQ›è¿™æ äh˜¯éžå¸¸çœæ—¶çœåŠ›çš„ï¼›ç‰¹åˆ«æ˜¯å¦‚æžœé¡¹ç›®è¾ƒå¤§ï¼ŒJavaBeans特别多,又是多äh协调开发,˜q™ç§æ–¹å¼å¯ÒŽé«˜å¼€å‘效率;降低出错率是非常大的帮助ã€?/p>

  如果你的™å¹ç›®ä¸­æœ‰éžå¸¸å¤šçš„¾c»ï¼›è°ƒç”¨å…³ç³»å¾ˆå¤æ‚,而且调用关系随时都可能变化,那么åQŒä‹É用无需照顾调用关系的Ioc容器无疑是减è½Õd¼€å‘负担的首选ã€?/p>

  ioc容器另外一个著名实现是Spring框架åQŒä½†æ˜¯åœ¨Spring的配¾|®æ–‡ä»¶applicationContext.xml中,我们必须考虑上述调用关系åQ?/p>

<bean id="b" class="test.B">
  <property name="a"><ref bean="a"/></property><!-- 必须指定调用关系 -->
  ....
</bean>
<bean id="a" class="test.A">
<bean id="c" class="test.C">

  所以,从以上对比来看,从项目开发效率角度看åQŒåŸºäºŽPiocContainer实现的Jdon框架在实际ä‹É用配¾|®æ•ˆçŽ‡æ— ç–‘è¦é«˜äºŽSpring框架ã€?/p>

  同时åQŒä¹Ÿå¯ä»¥è¯ß_¼šåŸÞZºŽPiocContainer实现的Jdon框架完全真正实现了Ioc容器的革命性优点:颠覆了“ä‹É用对象之前必™åÕdˆ›å»ºâ€?的基本Java语言定律



]]>
Ioc模式(è½?http://www.aygfsteel.com/ocean07000814/articles/70689.html非洲ž®ç™½è„?/dc:creator>非洲ž®ç™½è„?/author>Wed, 20 Sep 2006 01:30:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/70689.htmlhttp://www.aygfsteel.com/ocean07000814/comments/70689.htmlhttp://www.aygfsteel.com/ocean07000814/articles/70689.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/70689.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/70689.htmlIoc模式(又称DIåQšDependency Injection)

  分离å…Ï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模式可以延缓接口的实玎ͼŒæ ÒŽ®éœ€è¦å®žçŽŽÍ¼Œæœ‰ä¸ªæ¯”å–»å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ç±»åž?/td> 从JNDI或ServiceManager½{‰èŽ·å¾—è¢«è°ƒç”¨è€…ï¼Œ˜q™é‡Œ¾cÖM¼¼ServiceLocator模式ã€?/td> 1. EJB/J2EE
2. AvalonåQˆApache的一个复杂ä‹É用不多的™å¹ç›®åQ?/td>
½W¬äºŒ¿Uç±»åž?/td> 使用JavaBeansçš„setteræ–ÒŽ³• 1. Spring Framework,
2. WebWork/XWork
½W¬ä¸‰¿Uç±»åž?/td> 在构造方法中实现依赖 1. PicoContainer,
2. HiveMind

  有过EJB开发经验的人都知道åQŒæ¯ä¸ªEJB的调用都需要通过JNDIå¯ÀL‰¾åˆ°å·¥åŽ‚æ€§è´¨çš„Home接口åQŒåœ¨æˆ‘的教程EJB是什ä¹?/a>章节中,我也是从依赖和工厂模式角度来阐述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¾cÕd®žçŽ°æ³¨ž®„C¾cÕd…·ä½“实玎ͼŒå¦‚果把B¾cÀLƒ³åƒæˆ˜qè¡Œæ—¶çš„æ¨ªå‘动作åQŒæ— ç–‘注入C¾cÕd­¾cÕd°±æ˜¯AOP中的一¿UAdviceåQŒå¦‚下图åQ?/p>

  通过下列代码说明如何使用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()æ–ÒŽ³•使所有的应用¾cȝš„记录功能‹È€‹z…R€‚这是不是类似AOPçš„advice实现åQ?/p>

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

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÌúÁ¦ÊÐ| Т¸ÐÊÐ| ÆÕ¸ñÏØ| ¬ÁúÏØ| Çì³ÇÏØ| ÎèÑôÏØ| »Æ´óÏÉÇø| ºéºþÊÐ| ÏĺÓÏØ| ÁÙÏÄÊÐ| ºâÄÏÏØ| ÇÕÖÝÊÐ| »¯ÖÝÊÐ| ɳƺ°ÓÇø| ²ý¼ªÊÐ| ÁÉÄþÊ¡| ¶«ÎÚÖéÄÂÇ߯ì| ÉÛÎäÊÐ| Èý¶¼| ´ëÃÀÏØ| ¶«É½ÏØ| °²Æ½ÏØ| ºÓ³ØÊÐ| ³²ºþÊÐ| ×Ó³¤ÏØ| °²»¯ÏØ| ÄþÎäÏØ| ÐÂÔ´ÏØ| ÓÀ¸£ÏØ| ׿ÄáÏØ| »ÆÊ¯ÊÐ| μÄÏÊÐ| ÓôÄÏÏØ| ¾ÅÁú³ÇÇø| ÅîÀ³ÊÐ| ²èÁêÏØ| ºâ¶«ÏØ| ä»Ë®ÏØ| ÒËÁ¼ÏØ| ÔªÊÏÏØ| »ÆæèÊÐ|