IoC容器总结与简单模拟.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
IoC容器总结与简单模拟

IoC容器总结与简单模拟   当一个组件需要外部资源时,最直接也最明智的方法是执行查找,这种行为称为主动查找。但这种查找存在一个缺点——组件需要知道如何获得资源。一个好的获取资源的解决方案是应用IoC(Inversion of Control,控制反转)。它的思想是反转资源获取的方向。传统的资源查找方式是要求组件向容器发起请求来查找资源,作为回应,容器适时的返回资源。而应用了IoC之后,则是容器主动的将资源推送到它所管理的组件里,组件所要做的仅仅是选择一种合适的方式接受资源。   IoC是一种通用的设计原则,而DI(Dependency Injection,依赖注入)则是具体的设计模式,它体现了IoC的设计原则。DI是IoC典型的实现,所以IoC与DI术语会被混用。IoC与DI的关系就好比Java中的接口和接口的实现类的关系一样。   在DI模式下,容器全权负责的组件的装配,容器以一些预先定义好的方式(例如setter方法或构造函数)将匹配的资源注入到每个组件里。目前有三种类型的DI: setter注入,setter注入会存在一些问题,1. 容易出现忘记调用setter方法注入组件所需要的依赖,将会导致NullPointerException异常。2.?代码会存在安全问题,第一次注入后,不能阻止再次调用setter,除非添加额外的处理工作。但是由于setter注入非常简单所以非常流行(绝大多数Java IDE都支持自动生成setter方法)。 构造器注入,构造器注入能够一定程度上解决setter注入的问题。但是该中注入方式也会带来一些问题,如果组件有很多的依赖,则构造函数的参数列表将变得冗长,会降低代码可读性。 接口注入?,该注入方式使用的非常少,它要求组件必须实现某个接口,容器正是通过这个接口实现注入依赖的。接口注入的缺点比较明显,使用接口注入需要实现特定的接口,而接口又特定于容器,所以组件对容器产生了依赖,一旦脱离容器,组件不能重用。这是一种侵入式注入。   其中setter注入和构造器注入是被广泛运用的,绝大多数的IoC容器都支持这两种DI类型。 ? 模仿Spring?IoC容器 假设一个系统的功能之一是能够生成PDF或HTML格式的报表。 /*生成报表的通用接口*/ public interface ReportBuilder { public void build(String data); }  HYPERLINK javascript:void(0); 复制代码 生成PDF和HTML格式的实现类: /*生成HTML格式报表*/ public class ReportHtmlBuilder implements ReportBuilder { @Override public void build(String data) { /*示意代码*/ System.out.println(build html report!); } } /*生成PDF格式报表*/ public class ReportPdfBuilder implements ReportBuilder { @Override public void build(String data) { System.out.println(build pdf report!); } }  HYPERLINK javascript:void(0); 复制代码 报表服务类: /*报表服务类*/ public class ReportService { /*依赖ReportBuilder*/ private ReportBuilder builder; public ReportBuilder getBuilder() { return builder; } /*setter注入*/ public void setBuilder(ReportBuilder builder) { this.builder = builder; } public void builderYearReport(int year) { this.builder.build(data); } }  HYPERLINK javascript:void(0); 复制代码 IoC容器配置文件component.properties pdfBuilder=com.beliefbitrayal.ioc.inte

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档