您的当前位置:首页基于Spring框架的IOC模式的设计和实现
基于Spring框架的IOC模式的设计和实现
来源:锐游网
企肥学院学辛艮(自然科学版) Journal of Hefei University(Natural Sciences) 2011年2月 第21卷第1 基于Spring框架的IOC模式的设计和实现 周 岚 (芜湖信息技术职业学院软件工程系,安徽芜湖241000) 摘 要:IOC称为控制反转,也可称为依赖注入,是目前最优秀的解耦方式.在IOC模式下,创建被调用者的工作 不再由调用者来完成,而是通过Spring容器来完成.通过对IOC原理的分析及具体项目——在线项目管理平台 中任务管理模块的设计,具体给出了在Spring框架中IOC模式的实现. 关键词:IOC;Spring;设值注入 中图分类号:TP301 文献标识码:A 文章编号:1673—162X(2011)01—0049—05 The Design and Implementation of IOC Pattern Based on Spring Framework ZH0U Lan (Department of Software Engineering,Wuhu Vocational College of Information Technology,Wuhu,Anhui 241000,China) Abstract:IOC is short of inversion of control,it also called dependency injection(DI),and it is one of the best way of decoupling SO far.In IOC mode,the caller's work is FIO longer finished by the caller, but by the spring container.This paper describes the implementation of IOC mode in spring framework by analyzing the IOC principle and the design of management of task in on—line project management platform. Key words:IOC;Spring;setter injection 在面向对象的程序设计中IOC是一个重要的法则,IOC即Inversion of Control¨ ,称为控制反转,也可 称为依赖注入,是目前最优秀的解耦方式.其原理是基于OO设计原则的好莱坞原则:别找我们,我们会找 你. 当一个JAVA实例(调用者)需要另一个JAVA实例(被调用者)时,在传统的程序设计中,一般是调 用者来创建被调用者的实例.而在IOC模式下,创建被调用者的工作不再由调用者来完成,而是通过 Spring容器来完成.近年来,掀起了一股轻量级容器的热潮,几乎隔一段时间就有新量级容器出现.这些轻 量级容器能够较好地帮助开发者快速地将不同的组件组装成一个应用程序.这些都由一个共同的模式来 决定容器装配组件的方式,就是“控制反转”,即ioc.它削减计算机程序的耦合问题,方便维护扩展.类与 类之间或接口之间的依赖关系并不是在编译时就明确建立的,而是通过某些手段,在运行时建立. 1 IoC的原理分析 2004年美国专家Martin Fowler提出了“哪些方面的控制被反转了”这个问题.他提出的是依赖对象的 获得方式被反转了,并在这个结论基础上,为控制反转创造了一个更好的名字:依赖注入.非凡的应用都是 由两个或更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要与其他对象,也就是它所依赖 的对象的引用.但这个获取过程若要靠自身实现,这将导致代码高度耦合并且难实现. IOC也可称为“依赖倒置原理”(Dependency Inversion Principle).IOC模式是由Apache Avalon项目创 收稿日期:2010—10—19 修回日期:2010—12—12 基金项目:安徽省高等学校优秀青年人才基金项目(2009SQRZ224)资助. 作者简介:周岚(1978一),女,安徽绩溪人,芜湖信息技术职业学院软件工程系讲师,硕士 50 合肥学院学报(自然科学版) 第21卷 始人之一Stefano Mazzocchi L3 提出的,它并不是一种全新的设计理念,而是建立在面向对象的基础之上的 一种用来解决组件之间依赖关系、配置及生命周期的设计模式.在传统的程序设计中,上层模块都是在代 码中声明下层模块的实例或直接调用下层模块的方法.一旦下层模块的方法改变,相应的上层模块的代码 也需相应的修改,造成了上层模块依赖于下层模块.我们可以把上层模块中用到的方法提取出来定义成一 个接口,上层只针对接口编程,这就是依赖倒置. 通过框架管理可以把程序的运转流程由客户端程序中剥离出来,这就是控制反转.IOC的设计原理就 是应用控制反转,即当对象在被创建的时候,由一控制系统内所有对象的外界实体,将其所依赖对象的引 用传递给它.也可以说是依赖被注入对象中.依赖注入实现将上层模块和下层模块实现联系在一起,把框 架的流程和客户端的功能有机结合在一起.控制反转是关于一个对象如何获取其所依赖对象的引用这个 责任的反转.IOC中采用的最基本技术就是“反射”编程.通俗地说反射就是根据给出的类名来生成对象. 这种编程方式可以让对象在生成时才决定要生成哪一种对象.反射的应用是很广泛的,例如Hibernate、 Spring中都将“反射”作为最基本的技术手段. IOC模式的优点是系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命 周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开.IOC模式一个重 要的特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的 代码.因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样 的对象都是现实于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔,类似于 USB接口和SCIS硬盘,这就是IOC最大的好处. 2 IOC的实现方式 依赖注入又可分为3种方式:接口注入、设值注入和构造注入.在Spring容器中一般使用设值注入和 构造注入.IOC容器有很多,以Spring容器为例,用Spring容器来给一个被托管的class里的属性赋对象, 原始的要用new,而用Spring的IOC就可以直接注入对象来使用.通过IOC模式可以彻底解决接口驱动产 生的耦合,它把耦合从代码中移出去,放到统一的XML文件中,通过一个容器在需要的时候把这个依赖关 系形成,即把需要的接口实现注入需要它的类中. 接口注入的核心思想是通过借助接口来将调用者与实现者分离,服务需要实现专门的接口,通过专门 的接口,由对象提供这些服务,可以从对象查询依赖性.设值注入指的是通过setter方法传人被调用者的 实例,这种注入方式简单、直观,在Spring的依赖注入中大量使用.构造注入指的是通过构造函数来完成依 赖关系的设定而不是setter方法.设值注入与传统的Javabean的方法更相似,程序开发人员更容易了解、 接收.通过setter方法设定依赖关系显得更加直观、自然.对于复杂的依赖关系采用设值注入可以提高性 能,避免程序臃肿. 3 IoC在线项目管理平台中的具体设计和实现 、 3.1在线项目管理平台软件的功能在线项目管理平台系统的目标是搭建一个在线项目管垣协作平台, 方便项目负责人对于项目的规划、管理、任务分配和整体的把握,成员之间协作、沟通、分享资料和互相通 知以适应项目和团队的快速变化和远程协作. E—R图模型设计见图1.我们开发的这个在 线项目管理平台系统是部署于WEB服务器上的 B/S架构应用系统.系统用户可以使用设定的账号 登录系统.系统提供项目管理、人员管理、任务列表 管理和消息板功能. 由项目管理员创建或是添加项目,邀请人员加 人到相应项目中,查看项目信息以及结束项目.在 人员管理功能模块下项目管理员可以添加和邀请用 户,填写用户基本信息,给用户赋角色等.任务管理 图1在线项目管理平台E—R图 第 期 周岚:基于Spring框架的IOC模式的设计和实现 51 模块则可以对任务进行管理.消息板模块主要是实现成员间交流共享信息. 3.2任务管理模块任务管理模块可以对任务进行管理,如新建任务列表,在任务列表下添加任务(发 送邮件给任务所有者),将任务分配给某个成员(设置可见度),设置任务的优先级,设置任务的完成,对任 务进行评论,查看任务,按任务所有者过滤任务等.在线项目管理系统的角色分为项目经理(创建人)、技 术带头人、项目成员.项目经理具有最大的权限,具有所有的功能;技术带头人具有所有任务列表功能,如 果考虑到项目遇到技术困难等技术问题需要调整项目计划以及增加或者需要修改成员任务则需要和项目 经理协商,南项目经理负责调整处理;项目成员具有任务列表中的对任务进行评论功能以及查看任务功 能.任务管理模块用例图见图2. 图2任务管理模块用例图 3.3 IOC在在线项目管理平台中任务管理模块的具体设计和实现 第一步,定义接口 public interface TaskDao{ //定义任务接口,在接口中提供分配任务、更新任务、过滤任务、查看任务等方法. public void save(Taskitem taskitem); public void update(Taskitem taskitem); public void delete(int id); public Taskitem getTaskitemByld(int userid); public List<Taskitem>getTaskitemByUserId(int userid); public List<Taskitem>getTaskitemByProjcetld(int projectid); } 第二步,通过类来实现接口TaskDao public class Taskitem implements java.io.Serializable{ //通过不同的Taskitem来实现TaskDao接口,如可以根据项目名称和用户Id等得到相应项目的任务 列表信息. public Taskitem(){ } public Taskitem(Project project,User userByFromuserid){ this.project project: 52 合肥学院学报(自然科学版) 第21卷 this.userByFromuserid=userByFromuserid; l public Taskitem(Project project,User userByToUserId, User userByFromuserid,String context,Integer priority, Integer state,Date dateTime,Set taskitemreplies)t this.pr ̄ect project; this.userByToUserId=userByToUserld; this.userByFromuserid=userByFromuserid; this.context=context; this.priority=priority; this.state=state; this.dateTime=dateTime; this.taskitemreplies=taskitemreplies; } } 第三步,面向TaskDao接口编程,而不是具体的实现类 public class TaskService{ //所有的业务逻辑操作,面向TaskDa。接口编程,返回相应的任务编号、任务内容、优先级、任务状态 等信息. private TaskDao taskDao; public TaskDao getTaskDao(){ return taskDao; l public void setTaskDao(TaskDao taskDao){ //设值注入所需的setter方法. this.taskDao=taskDao; } public Taskitem getTaskitemByld(int userid){ //TODO Auto——generated method stub return this.taskDao.getTaskitemById(userid); } public List<Taskitem>getTaskitemByUserId(int userid){ //TODO Auto——generated method stub return this.taskDao.getTaskitemByUserId(userid); } .} 第四步,通过相应的spring文件applicationContext.xml来配置注入,配置文件中的class属性必须是真 正的实现类,而不是接口. <!一一任务DAO配置注入一一> <bean name:”taskHibDao”class=”corn.dragon.online.dao.imp1.TaskHibemateDao”> <property name=”sessionFactory”ref=”sessionFaetory’’/> </bean> <!一一任务Service配置注入一一> <bean name:”taskService”class=”com.dragon.online.service.TaskService”> 笙!塑 .周岚:基于Spring框架的IOC模式的设计和实现 53 7<property name:”taskDao”ref:”taskHibDao”/> ?</bean> 一<!一一任务Action配置注入一一> <bean name:”taskAction”class=”eom.dragon.online.ui.action.TaskAction”> <property name=”taskService”ref=”taskServiee”/> <property name:”taskreplyServiee”ref=”taskreplyService”/> app1icati0nC0ntext—Hibernate.xml </bean> 最后,可以在在主程序文件中实例化spring的上下文,如 public Taskitem getTaskitemById(int userid){ //TODO Auto——generated method stub return this.taskDao.get I’askitemById(userid); } 3.4任务管理模块功能界面根据任务管理模块的功能 设计,在具体界面中用户可以实现切换到相应项目,点击任 务列表,显示关于此项目所有的任务等操作.任务管理模块 具体实现效果图如图3所示. 4 结束语 通过IOC模式可以减少黏合代码,将依赖的配置外 置,并在统一的地方集中管理依赖.bean与bean之间的依 赖关系有Spribean的灵巧性.bean与bean之间的依赖关系不是放在代 ng管理,从配置文件中可以看到Spring管理 图3任务管理模块功能实现界面 码中,而是被放在配置文件里组织,通过配置文件的指定,Spring能精确的为每个bean注入属性.每个 bean的id属性是该bean唯一的标识,bean与bean之间的依赖关系通过id属性来关联,程序也是通过id 来访问每个bean.Spring自动接管每个bean中的property元素定义.property元素定义的属性值不再由该 bean来主动创建和管理,而是接收Spring的注人.当主程序调用相应方法时,程序中并没有任何地方将该 方法体内所需的实例和程序中特定的实例耦合在一起,而是由Spring框架为我们在运行期间动态注入的. 通过配置文件动态管理,可以是对象与对象之间的依赖关系从代码中分离出来,业务对象的更换也变得相 当简单.利用IOC模式可以降低软件开发问题的复杂度.IOC是人们控制依赖关系的一次成功变革 ,但 它并没有完全消除组件之间的依赖关系,而是把分散在程序各处的依赖独立出来转移到配置文件中,由容 器集中创建、管理. 参考文献: [1] 罗海丽.IOC/DI原理浅析[J].中国高新技术企业,2008(10):158. [2] 唐金鹏.IOC的注入方式研究[J].科技信息:学术版,2006(7):101—102. [3]柯玲,徐京,李颖.IOC模式及其在设备监控软件中的应用[J].航天器工程,2009(18):117—122. [4] 薄奇,许林英.Spring框架中IOC的实现[J].微机处理,2008,29(1):147—149. [5] 谌桂枝,沈晓建,龚兴艳.基于Spring框架的IOC微内核的实现机制与应用[J].湖南工业大学学报,2009,23(3):50一 3 [责任编校:李军]
因篇幅问题不能全部显示,请点此查看更多更全内容