




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
依赖注入与JSR-330的参考实现Guice2015/05/12 | 分类:基础技术|0 条评论| 标签:GUICE分享到:1原文出处:wwsun.me依赖注入(控制反转的一种形式),它是Java开发主流中一个重要的编程范式(思维方式)。简单的说,使用DI技术可以让对象从别处获得依赖项,而不是由它自己来构造。使用DI有很多好处,它能降低代码之间的耦合度,让代码更易于测试、更易读。Java DI的官方标准是JSR-330,本文我们还会介绍JSR-330的参考实现Guice 3,一个轻量级 的DI框架。IoC and DI使用IoC范式编程时,程序逻辑的流程通常是由一个功能中心来控制的。而使用IoC,这个“中心控制”的设计原则会被反转过来。调用者的代码处理程序的执行顺序,而程序逻辑则被封装在接受调用的子流程中。通过一个例子来理解IoC:在GUI应用中,GUI框架负责控制调用事件处理器,而不是应用逻辑。当用户点击了一个动作,比如“向前”,GUI框架会自动调用 对应的事件处理器,而应用逻辑可以把重点放在处理动作上。程序的控制被反转了,将控制权由应用逻辑转移到了GUI框架。IoC也被称为好莱坞原则:会有另一段代码拥有最初的控制线程,并且由它来调用你的代码,而不是由你的代码调用它。不要给我们打电话,我们会打给你。好莱坞原则IoC有多种不同的实现,包括工厂模式、服务器定位模式,当然还有依赖注入。需要注意的是,DI并不等于IoC,DI只是IoC的一种实现方式,IoC是一种机制。DI是IoC的一种特定形态,是指寻找依赖项的过程不在当前执行代码的直接控制之下。Java中为DI提供的容器有Guice、Spring、PicoContainer等。DI的好处有:松耦合、易测试、强内聚、可重用、更轻盈的代码。Example下面编写代码来解释到底什么是DI,如何使用DI。我们首先编写传统的代码,然后使用工厂模式解耦,进而再使用DI来改进代码,通过这个过程,你将了解到DI的精妙之处。这些改进都基于同一个关键技术,即面向接口编程。假设你想找到所有对Java可开发人员比较友善的好莱坞经纪人。首先,我们有了一个AgentFinder接口,及其两个实现类SpreadSheetAgentFinder和WebServiceAgentFinder。AgentFinder接口如下:123public interface AgentFinder public List findAllAgents();传统方式寻找友善经纪人为了找到经纪人,项目中有个默认的HollywoodService类,它会从SpreadSheetAgentFinder里得到一个经纪人列表,并且过滤出友善的经纪人,最终返回该列表。12345678910public class HollywoodService public static List getFriendlyAgents() AgentFinder finder = new SpreadsheetAgentFinder();List agents = finder.findAllAgents();List friendlyAgents = filterAgents(agents,Java Developers);return friendlyAgents;/filterAgents这是最传统的编码方式,显然,HollywoodService被SpreadsheetAgentFinder这个AgentFinder的具体实现死死的绑定住了。为了改进这个问题,通常我们会想到一个常用的设计模式工厂模式。工厂模式可以一定程度上解耦程序,它也是IoC的一种实现方式。工厂模式利用工厂模式(其实这里用到的是一个简单工厂)重新编写上面的代码,如下:123456public List getFriendlyAgents(String agentFinderType) AgentFinderFactory factory = AgentFinderFactory.getInstance();AgentFinder finder = factory.getAgentFinder(agentFinderType);List agents = finder.findAllAgents();return filterAgents(agents, Java Developers);如你所见,这里不再有具体的实现来黏住你,而是通过注入agentFinderType的方式让你选择想要的AgentFinder。但这里仍然还有问题:1. 代码注入的仅仅是一个引用凭据(agentFinderType),而不是真正实现AgentFinder的对象2. 方法getFriendlyAgents中还有获取其依赖的代码,达不到只关注自身智能的理想状态我们需要通过DI来达成这两个目标。手工实现DI1234public static List getFriendlyAgents(AgentFinder finder)List agents = finder.findAllAgents();return filterAgents(agents,Java Developers);上面的代码是一个纯手工打造的DI方案,AgentFinder被直接注入到getFriendlyAgents方法中。现在这个getFriendlyAgents方法干净利落,只专注于纯业务逻辑。但是,这种手工方式的DI显然存在问题,如何配置AgentFinder具体实现的问题并没有解决,原本AgentFinderFactory要做的工作还是要找一个地方去做。解决这个问题的方式是借助DI框架,而DI框架就是把你的代码打包起来的运行时环境,在你需要的时候注入依赖项。使用GuiceJava中DI方面的标准规范是JSR-330,它提供了统一的DI通用功能的标准,而且提供了你需要了解的幕后规则及限制。这里不具体介绍JSR-330,有兴趣的可以查找相关资料阅读。我们重点介绍JSR-330的参考实现Guice,它是一个由Google实现的针对Java 6以上版本的流行的、轻量级的DI框架。下面我们使用Guice来解决手工方式实现DI的不足问题:首先我们需要创建一个定义绑定关系的AgentFinderModule模块(配置类)。123456public class AgentFinderModule extends AbstractModuleOverrideprotected void configure() bind(AgentFinder.class).to(WebServiceAgentFinder.class);绑定关系的确立在调用Guice的bind方法时发生,把要绑定的类(AgentFinder)传给它,然后调用to方法指明要注入到哪个实现类。下面我们来Guice版本的HollywoodService:123456789101112131415public class HollywoodServiceGuice private AgentFinder finder = null;Injectpublic HollywoodServiceGuice(AgentFinder finder)this.finder = finder;public List getFriendlyAgents()List agents = finder.findAllAgents();return filterAgents(agents, Java Developers);/.我们在模块中声明了绑定关系,下面我们就可以让注入器构建对象关系图了。接下来我们看看在独立Java程序和Web应用程序这两种情况下分别要如何实现:1.构建Guice对象关系图独立Java程序1234567public class HollywoodServiceClient public static void main(String args) Injector injector = Guice.createInjector(new AgentFinderModule();HollywoodServiceGuice hollywoodServiceGuice = injector.getInstance(HollywoodServiceGuice.class);List agents = hollywoodServiceGuice.getFriendlyAgents();2.构建Guice对象关系图Web应用程序 把Gucie-servlet.jar加到web应用的类库中,然后再web.xml中添加下面的配置项:123456789guiceFiltercom.google.inject.servlet.GuiceFilterguiceFilter/*3.然后是标准动作,扩展ServletContextListener以便使用Guice的ServeltModule:1234567public class MyGuiceServletConfig extends GuiceServletContextListener Overrideprotected Injector getInjector() return Guice.createInjector(new ServletModule();4.最好,将其加入到web.xml文件中,以便servlet容器在部署应用时触发该类:123com.example.MyGuiceServletConfig经由注入器创建HollywoodServiceGu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业管理公司退出及业主委员会接管协议
- 离婚协议中房产租赁权与财产分割协议范本
- 离婚协议样本及子女抚养费及赡养费保证协议
- 离婚协议书参考文本:财产分割与子女抚养协议书样本
- 离婚协议中双方子女生活费用承担协议范本
- 离婚后财产分割与同居期间生活费用分摊协议范本
- 离婚协议中双方隐私保护协议范本
- 家用净水器租赁与定期水质检测服务协议
- 离婚协议范本:子女抚养权与父母探视权详细条款
- 2025年医学影像学影像学报告撰写规范试卷答案及解析
- 国能灵璧浍沟70MW风电项目 XGC15000TM-1000t履带吊-1000及SCC8000A-800t履带吊安拆方案
- 小学一年级数学试卷100题
- 2024年中国食品包装用衬纸铝箔市场调查研究报告
- 附件1:肿瘤防治中心评审实施细则2024年修订版
- 培训课件 -王宝顺(泰然)《阳明心学-新时代企业管理的运用》
- 人类用智慧设计世界-认识设计 课件-2023-2024学年高中美术人美版(2019)选择性必修4 设计
- DL-T573-2021电力变压器检修导则
- 测绘师《测绘管理与法律法规》知识点必考必练试题库200题(含详解)
- 马克思主义基本原理概论400道及参考答案【b卷】
- 管理会计-说课
- 《肿瘤知识培训》课件
评论
0/150
提交评论