注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老陈的博客

非淡泊无以明志,非宁静无以致远,说的是心态!

 
 
 

日志

 
 

什么是IOC控制反转模式  

2009-12-29 15:37:38|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
IOC(Inversion of Control)控制反转模式,意味着去除所有有该类产生但不由该类直接负责的对象实例,而改由外界传入。
由简单的对象开发模式到IOC(控制翻转)
1.最简单的开发模式
public class FileHelloStr{
    protected static final Log log=LogFactory.getLog(FileHelloStr.class);
    private String profilename;
   
    public String getContent(){
        String helloworld="";
              try{
            Properties properties=new Properties();
            InputStream is=getClass().getClassLoader().getResourceAsstream(propfilename);
            properties.load(is)
            is.close();
            helloworld=properties.getProperty("helloworld");
        }catch(FileNotFoundException ex){
            log.error(ex);
        }catch(IOException ex){
            log.error(ex);
        }
        return  helloworld;
    }
}
public class HelloWorld{
    protected static final Log log=LogFactory.getLog(HelloWorld.class);
    public String getContent(){
        FileHelloStr fhStr=new FileHelloStr("helloworld.properties");
        String helloworld=fhStr.getContent();
        return helloworld;
    }
}
public class HelloWorldClient{
    protected static final Log log=LogFactory.getLog(HelloWorldClient.class);
    public static void main(String[] args){
        HelloWorld hw=new HelloWorld();
        log.info(hw.getContent());
    }
   
}
评:
    上述代码中,我们可以明显看出:HelloWorld明显依赖于FileHelloStr。如果开发者需要通过
其他途径获得"Hello World!"的信息,则需要重构现有的FileHelloStr类,即通过更通用的HelloStr接口
形式给出。一种较好的实现方式是将创建FileHelloStr对象的职责委派给HelloWorldClient客户。第2个
例子实现了这种需求
2.增加接口的开发模式
public interface HelloStr{
    public String getContent();
}
public class FileHelloStr implements HelloStr{
    //内容同上
}
public class HelloWorld{
    protected static final Log log=LogFactory.getLog(HelloWorld.class);
    private HelloStr hstr;
    public HelloWorld(HelloStr hstr){
        this.hStr=hStr;
    }   
    public String getContent(){
        return hstr.getContent();
    }
}
public class HelloWorldClient{
    FileHelloStr fhStr=new FileHelloStr("helloworld.properties");
    HelloWorld hw=new HelloWorld(fhStr);
    log.info(hw.getContent());
}
评:
     HelloWorld不再操作FileHelloStr了,而是对FileHelloStr实现的HelloStr接口进行操作。
从而使得现在的HelloWorld更加通用了。但是,现有的应用还是存在HelloWorld中。
因此,开发者需要借助于工厂类,以注入HelloWorld和FileHelloStr的依赖性。
3.增加工厂模式
public class HelloWorldFactory{
    public static HelloWorld getFileHelloWorld(){
        HelloStr hstr=new FileHelloStr("helloworld.properties");
        HelloWorld hw=new HelloWorld(hStr);
        return hw;
    }
}
重构客户代码
public class HelloWorldClient{
    protected static final Log log=LogFactory.getLog(HelloWorld.class);
    public static void main(String args[]){
        HelloWorld hw=HelloWorldFactory.getFileHelloWorld();
        log.info(hw.getContent();
    }       
}

评: HelloWorldFactory负责创建和集成客户应用所需要的对象。
    至此,开发者终于借助与依赖注入(HelloWorldFactory类)实现了反转控制
 
以上内容摘自:《精通spring》
以下内容引自:

什么叫控制反转呢?

套用好莱坞的一句名言就是:你呆着别动,到时我会找你。
什么意思呢?就好比一个皇帝和太监
有一天皇帝想幸某个美女,于是跟太监说,今夜我要宠幸美女
皇帝往往不会告诉太监,今晚几点会回宫,会回哪张龙床,他只会告诉太监他要哪位美女
其它一切都交由太监去安排,到了晚上皇帝回宫时,自然会有美女出现在皇帝的龙床上
这就是控制反转,而把美女送到皇帝的寝宫里面去就是注射
太监就是是框架里面的注射控制器类BeanFactory,负责找到美女并送到龙床上去
整个后宫可以看成是Spring框架,美女就是Spring控制下的JavaBean
而传统的模式就是一个饥渴男去找小姐出台
找领班,帮助给介绍一个云云,于是领班就开始给他张罗
介绍一个合适的给他,完事后,再把小姐还给领班,下次再来
这个过程中,领班就是查询上下文Context,领班的一个职能就是给客户找到他们所要的小姐
这就是lookup()方法,领班手中的小姐名录就是JNDI//Java Naming and Directory Interface
小姐就是EJB,饥渴男是客户端,青楼是EJB容器
看到区别了么?饥渴男去找小姐出台很麻烦,不仅得找,用完后还得把小姐给还回去
而皇帝爽翻了,什么都不用管,交给太监去处理,控制权转移到太监手中去了
而不是皇帝,必要时候由太监给注射进去就可以了
看到Spring的美妙了吧,Spring还提供了与多个主流框架的支持
可以和其它开源框架集成
  评论这张
 
阅读(184)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017