工厂模式的升级 IOC 依赖注入 控制反转
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。 总结 1、如下图所示有三个类,Human(人类)是接口,Chinese(中国人)是一个子类,American(美国人)是另外一个子类。 源代码如下: java代码packagecn.com.chengang.spring; publicinterfaceHuman{ voideat(); voidwalk(); } packagecn.com.chengang.spring; publicclassChineseimplementsHuman{ /*(非Javadoc) *@seecn.com.chengang.spring.Human#eat() */ publicvoideat(){ System.out.println("中国人对吃很有一套"); } /*(非Javadoc) *@seecn.com.chengang.spring.Human#walk() */ publicvoidwalk(){ System.out.println("中国人行如飞"); } } packagecn.com.chengang.spring; publicclassAmericanimplementsHuman{ /*(非Javadoc) *@seecn.com.chengang.spring.Human#eat() */ publicvoideat(){ System.out.println("美国人主要以面包为主"); } /*(非Javadoc) *@seecn.com.chengang.spring.Human#walk() */ publicvoidwalk(){ System.out.println("美国人以车代步,有四肢退化的趋势"); } } 2、对以上对象采用工厂模式的用法如下 创建一个工厂类Factory,如下。这个工厂类里定义了两个字符串常量,所标识不同的人种。getHuman方法根据传入参数的字串,来判断要生成什么样的人种。 java代码packagecn.com.chengang.spring; publicclassFactory{ publicfinalstaticStringCHINESE="Chinese"; publicfinalstaticStringAMERICAN="American"; publicHumangetHuman(Stringethnic){ if(ethnic.equals(CHINESE)) returnnewChinese(); elseif(ethnic.equals(AMERICAN)) returnnewAmerican(); else thrownewIllegalArgumentException("参数(人种)错误"); } } 下面是一个测试的程序,使用工厂方法来得到了不同的“人种对象”,并执行相应的方法。 java代码packagecn.com.chengang.spring; publicclassClientTest{ publicstaticvoidmain(String[]args){ Humanhuman=null; human=newFactory().getHuman(Factory.CHINESE); human.eat(); human.walk(); human=newFactory().getHuman(Factory.AMERICAN); human.eat(); human.walk(); } } 3、采用Spring的IoC的用法如下: 在项目根目录下创建一个bean.xml文件 xml代码<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <beanid="Chinese"class="cn.com.chengang.spring.Chinese"/> <beanid="American"class="cn.com.chengang.spring.American"/> </beans> 修改ClientTest程序如下: java代码packagecn.com.chengang.spring; importorg.springframework.context.ApplicationContext; importorg.springframework.context.support.FileSystemXmlApplicationContext; publicclassClientTest{ publicfinalstaticStringCHINESE="Chinese"; publicfinalstaticStringAMERICAN="American"; publicstaticvoidmain(String[]args){ //Humanhuman=null; //human=newFactory().getHuman(Factory.CHINESE); //human.eat(); //human.walk(); //human=newFactory().getHuman(Factory.AMERICAN); //human.eat(); //human.walk(); ApplicationContextctx=newFileSystemXmlApplicationContext("bean.xml"); Humanhuman=null; human=(Human)ctx.getBean(CHINESE); human.eat(); human.walk(); human=(Human)ctx.getBean(AMERICAN); human.eat(); human.walk(); } } 从这个程序可以看到,ctx就相当于原来的Factory工厂,原来的Factory就可以删除掉了。然后又把Factory里的两个常量移到了ClientTest类里,整个程序结构基本一样。再回头看原来的bean.xml文件的这一句: <bean id="Chinese" class="cn.com.chengang.spring.Chinese"/> id就是ctx.getBean的参数值,一个字符串。class就是一个类(包名+类名)。然后在ClientTest类里获得Chinese对象就是这么一句human = (Human) ctx.getBean(CHINESE); 因为getBean方法返回的是Object类型,所以前面要加一个类型转换 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |