论坛首页 Java企业应用论坛

阿Q:革命了,革命了!(也谈IOC的好处)

浏览 29524 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-03-17  
gigix 写道
// Dependent Component
public interface BIntf {
  void doSomething();;
}
public class BImpl implements BIntf {
  public void doSomething(); {
    // do something here.
  }
}

// Component A using B
// 1. without IoC, direct create
public class A {
  public void doSomething(); {
    BIntf b;  // dependency #1, with BIntf
    b = new BImpl();;  // dependency #2, with BImpl
    b.doSomething();;
  }
}

// 2. without IoC, using customized factory
public class A {
  public void doSomething(); {
    BIntf b;  // dependency #1, with BIntf
    b = BFactory.create();;  // dependency #2, with BFactory
    b.doSomething();;
  }
}

// 3. type 0 IoC
public class A {
  public void doSomething(BIntf b); { // dependency #1, with BIntf
    b.doSomething();;
  }
}

// 4. type 2 IoC, setter injection
public class A {
  private BIntf _b;  // dependency #1, with BIntf 
  public void setB(BIntf b); {
    _b = b;
  }
  public void doSomething(); {
    _b.doSomething();;
  }
}

// 5. type 3 IoC, constructor injection
public class A {
  private BIntf _b;  // dependency #1, with BIntf 
  public A(BIntf b); {
    _b = b;
  }
  public void doSomething(); {
    _b.doSomething();;
  }
}

哪个依赖多,哪个依赖少,一目了然。


不要意思我的笔误 是 C-->A
引用

// 这就是你所说的C
class Container {
  public Object getObject(String name);

谁来调用着这个Container?不要老是回避这个问题!不引入C你的代码无法运行!
0 请登录后投票
   发表时间:2005-03-17  
JJYAO 写道
C 说 A 你我去桂林,你帮我安排一下吧!A 说没问题, :对了旅馆代理 你注射给我,我车票代理 你注射给我, 我还需要导游你介绍给我,都全了?我开始给你安排


关键的问题是,如果你认为这家旅馆或车票代理永远不会倒闭的话,你可以这样做....如果一个月后倒闭了...后果



当然由A自己去找新的! 你去找旅行社?还问我以前的呢个旅馆 代理还在么? 你不需要管这个问题,由A自己去解决!A 是独立的!不是殖民地!
0 请登录后投票
   发表时间:2005-03-17  
frankensteinlin 写道
谁来调用着这个Container?不要老是回避这个问题!

这问题忒简单。你用Spring MVC或者WebWork+Spring做一个sample,或者就看看JPetStore。你要是需要写一行代码调用container,Rod Johnson就算白写那本书了。
谁调用container?第一肯定不是需要你写的任何代码,你不需要也不应该在任何时候调用container。第二这个框架提供的“调用container”的代码只需要写一遍,写完一遍100个项目都适用。
0 请登录后投票
   发表时间:2005-03-17  
引用

C 说 A 你我去桂林,你帮我安排一下吧!A 说没问题, :对了旅馆的标准要求 你注射给我,什么标准的车票 你注射给我, 还需要什么标准的导游你介绍给我,都全了?我开始给你安排
A如果是秘书,c会怒:靠,我的标准还不知道?
A如果是代理公司,c会高兴:服务真周到.

太好的例子了,标准不都在interface里面规定好了么,inerface 就是合同阿,问题是ioc要求注射的是实例!谁来创建这个实例?C 还是 A ?
0 请登录后投票
   发表时间:2005-03-17  
frankensteinlin 写道
由A自己去解决!A 是独立的!不是殖民地!

那么好了,业务组件本来就不应该是独立的,或者说得更准确点,self-contain的。为什么?如果业务组件是self-contain的,它自己管自己的一切外部环境,你就没办法把它拆出来单独测试,你就得把整个外部环境都给它准备到位。你也没办法把它直接弄到另一个环境去复用。
讨论问题就讨论问题,有证据就拿证据出来说,每句话打个感叹号难道就有道理了?
0 请登录后投票
   发表时间:2005-03-17  
嘿嘿,简单的讲所谓使用IOC,要不自己实现上面的C,要不利用Springframework,哈哈
0 请登录后投票
   发表时间:2005-03-17  
gigix 写道
frankensteinlin 写道
谁来调用着这个Container?不要老是回避这个问题!

这问题忒简单。你用Spring MVC或者WebWork+Spring做一个sample,或者就看看JPetStore。你要是需要写一行代码调用container,Rod Johnson就算白写那本书了。
谁调用container?第一肯定不是需要你写的任何代码,你不需要也不应该在任何时候调用container。第二这个框架提供的“调用container”的代码只需要写一遍,写完一遍100个项目都适用。


Rod Johnson就算是圣贤,也不是神仙!搬出个权威压不倒我.现在这个例子很简单 就 A B 两个类,你要引入一个ioc framework 让把inject.就算你用typeN好了,谁来做ainstance.setB(binstance)?或者A(binstance)这一步?谁完成这最后一跳?
0 请登录后投票
   发表时间:2005-03-17  
gigix 写道
frankensteinlin 写道
由A自己去解决!A 是独立的!不是殖民地!

那么好了,业务组件本来就不应该是独立的,或者说得更准确点,self-contain的。为什么?如果业务组件是self-contain的,它自己管自己的一切外部环境,你就没办法把它拆出来单独测试,你就得把整个外部环境都给它准备到位。你也没办法把它直接弄到另一个环境去复用。
讨论问题就讨论问题,有证据就拿证据出来说,每句话打个感叹号难道就有道理了?


我可以把整个故事讲的很清楚了:
引用


C 说 A 你我去桂林,你帮我安排一下吧!A 说没问题, :对了旅馆代理 你注射给我,我车票代理 你注射给我, 我还需要导游你介绍给我,都全了?我开始给你安排。

活生生的例子阿,到时你抽象的组件阿组件的,软件不就是现实生活的抽象么!你说A应该怎么做?现实的问题啊!
0 请登录后投票
   发表时间:2005-03-17  
软件设计本来就是分工协作。
是,每个功能都要有模块做,但是不表示这些功能都要塞到一个模块去做。

否则,任何一个程序都要有个main()才能运行,你是否要让你的类都“独立自主”到非带有main()不可?


gigix说必须不能调用容器,或者必须不能自己组装组件。也许我理解错了,我是有点不同意的。
只要这个调用容器的代码或者组装的代码不在组件内部,只要它是一个单独负责组装的模块,是不是必须要由容器自动装配倒无关紧要。

容器代码也没什么特殊,不过是一个专门负责组装对象的模块。如果高兴,或者不愿意依赖容器,那么自己写也没什么。
0 请登录后投票
   发表时间:2005-03-17  
frankensteinlin 写道
现在这个例子很简单 就 A B 两个类,你要引入一个ioc framework 让把inject.就算你用typeN好了,谁来做ainstance.setB(binstance)?或者A(binstance)这一步?谁完成这最后一跳?

不妨假设A是一个web action。我相信你没用过IoC容器也该用过MVC框架例如Struts和WebWork,那么你肯定知道,HTTP请求进来以后有一个总控的DispatchServlet解析query string,然后把请求分发到action。那问题就很简单,DispatchServlet调用Container.getObject("bName"),取到B的实例,交给A去用。这部分逻辑在DispatchServlet实现一遍,所有的web action都可以被注射。
请注意,唯一需要调用container的理由,是取到一个business facade。facade以下的所有组件,容器内部已经装配完毕。“取得facade”的动作,如上所述,只需要在框架(例如MVC框架)实现一次,所有项目都可以复用。请问还有什么问题?
引用
嘿嘿,简单的讲所谓使用IOC,要不自己实现上面的C,要不利用Springframework,哈哈

错。你还可以用PicoContainer,你还可以用HiveMind。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics