spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化。程序在调用spring容器的时候,会自动根据配置文件(可以自己命名xml文件,不一定是web.config或app.config)的配置,给你实例化好对象供你调用。这些实例化对象,是基于单例模式的,当然可以在配置文件里修改单例模式singleton为false,这样每次生成的都是在内存中开辟的新的对象。另外也可以在配置文件里设置lazy-init(延迟加载)为true,这样就是只有对象被调用的时候 GetObject(“对象名"),才会实例化对象。

spring.net的依赖注入,支持属性注入,构造器注入,集合注入,方法注入。示例如下:

一、属性注入

在相应的xml文件中配置如下:

<objects><object id="compute" type="Service.Implement.Compute,Service"></object><object id="modernPerson" type="Service.Implement.ModernPerson,Service"><!--属性注入 Tool对象由compute类注入实现--><property name="Tool" ref="compute"></property></object>
</objects>

其中modernPerson的结构如下:

public  class ModernPerson:IPerson{public ITool Tool { get; set; }public string Work(){string str= Tool.UseTool();return "现代工人: "+str;}}

在页面中调用方法为:

IApplicationContext ctx = ContextRegistry.GetContext();//属性注入 moderPerson的work方法会调用Tool对象的UseTool方法,Compute类实现接口对象ToolService.Implement.ModernPerson mp = ctx.GetObject("modernPerson") as Service.Implement.ModernPerson;Response.Write("<br/>"+mp.Work());

页面输出结果如下:

现代工人: 使用电脑办公:Compute

二、构造器注入

相应的xml配置文件如下:

<object id="personDao" type="Dao.PersonDao,Dao"><!--构造器注入 ref为指定的对象 ,若为值类型,则为value--><constructor-arg name="per" ref="person"></constructor-arg><constructor-arg name="remark" value="welcome"></constructor-arg></object>

页面调用方法如下:

//构造器注入void   ConstructorInjection(){IApplicationContext ctx = ContextRegistry.GetContext();PersonDao p = ctx.GetObject("PersonDao") as PersonDao;Response.Write("<br/>"+ p.ToString());}

其中personDao重写了tostring方法,以验证是否读取到构造器中的数据,personDao内部代码如下:

private Person _Person;private string _Remark;public PersonDao(Person per,string remark){_Person = per;_Remark = remark;}public override string ToString(){return _Remark + "用户名:" + _Person.Name + " 性别:" + _Person.Sex;}

页面输入结果如下:

welcome用户名:flowbywind 性别:Boy

三、集合类型的注入

关于集合类型,常用的包括List和Dictionary等,下面一一介绍

a)IList类型

使用<list>元素作为IList的标签,element-type属性为泛型的类型,如Int,命名空间.类名,string等;

value为集合中元素的值;

<ref/>表示关联的对象,ref的object属性为关联对象的id或name;

集合也可以为空,用<null/>元素作为标记,此时不声明list元素。

如此时person对象的成员如下:

public IList<Person> Persons { get; set; }public IList Hobbys;public IList<string> WeekWorkDay;

其在xml中的配置如下:

<property name="Persons"><list element-type="Domain.Person,Domain"><ref object="person"></ref></list></property><property name="WeekWorkDay"><list element-type="string"><value>MonDay</value><value>Tuesday</value><value>Wednesday</value><value>Thursday</value><value>Friday</value></list></property><property name="Hobbys"><list><value>Reading</value><value>Running</value></list></property><!--空集合属性--><!--<property name="BestFriends"><null/></property>-->

调用代码为:

//List集合注入void GenericInjection(){IApplicationContext ctx = ContextRegistry.GetContext();PersonDao p = ctx.GetObject("PersonDao") as PersonDao;//输出list<Person>对象foreach (Person item in p.Persons){Response.Write("<br/>采访人:" + item.Name +" &nbsp;性别:"+ item.Sex);}//输出List<string>string output=string.Empty;foreach (var item in p.WeekWorkDay){output += item + " &nbsp;";}Response.Write("<br/>&nbsp;&nbsp;每周在" + output + "工作");output = string.Empty;//输出IListforeach (var item in p.Hobbys){output += item + "&nbsp;";}Response.Write("<br/>&nbsp;&nbsp;爱好为" + output);}

最后页面输出结果为:

采访人:flowbywind  性别:Boy每周在MonDay  Tuesday  Wednesday  Thursday  Friday  工作爱好为Reading Running

b)IDictionary类型

使用<dictionary/>表示IDictionary集合,其中key-type和value-type属性分别为Dict的键值对象类型;

使用<entry>用来表示dict集合的元素,key和value属性为元素的键值队,value-ref为关联的元素

<property  name="DicGrade"><dictionary  key-type="string" value-type="object" ><entry key="2012" value="最佳懒人将"></entry><entry key="2013" value-ref="person"></entry></dictionary></property>

四、方法注入

方法注入的目的,是为了解决非单例对象的方法调用。情景为单例对象A,引用了非单例对象B,B此时可能已经注销,但A被生成一次后,无法再次生成,当A想调用B的方法时,就只能重新注入B。A可以通过实现IObjectFactoryAware来获取容器的引用,并通过调用GetObject(“B”)来生成一个新的B对象,但这样做违反了控制反转原则,方法注入此时便是一个比较优雅的解决方案。示例如下:

xml中代码如下:

<object id="objectFactory" type="Dao.ObjectFactory,Dao"><!--注入查找方法--><lookup-method name="CreatePersonDao" object="personDao"></lookup-method></object>

其中CreatePersonDao方法是抽象类ObjectFactory的抽象方法,返回PersonDao实例,继而调用personDao里的方法;

相应页面调用的方法为:

Response.Write("<br/>查询方法:");IApplicationContext ctx = ContextRegistry.GetContext();ObjectFactory factory = ctx.GetObject("objectFactory") as ObjectFactory;Response.Write("<br/>"+factory.CreatePersonDao().InjectionFunc());

除了查找方法外,还有替换方法和事件注入,源码中有相应实例;

参考资料:http://tech.ddvip.com/2009-11/1258094512138413_2.html

http://tech.ddvip.com/search.php?key=Spring.NET%E6%95%99%E7%A8%8B

源码下载

转载于:https://www.cnblogs.com/xiaohua19920/p/9634000.html

Spring.Net---4、IoC/DI注入方式相关推荐

  1. spring入门之Spring 常用的三种注入方式

    Spring 常用的三种注入方式 Spring 通过 DI(依赖注入)实现 IOC(控制反转),常用的注入方式主要有三种:构造方法注入,set 方法注入,基于注解的注入. 一.通过构造方法注入 先简单 ...

  2. spring(一):spring IoC的注入方式总结

    前言:谈谈对springIOc的理解,两张图很好的阐述了springIoc容器的作用. 传统应用程序示意图.jpg IoC容器后程序结构示意图.jpg springIoC容器注入方式有set注入,构造 ...

  3. Spring之DI注入方式

    什么是DI? DI(Dependency Injection)依赖注入,指容器复制创建和维护对象之间的依赖关系,而不是通过对象本身复制自己的创建和解决自己的依赖.控制反转是通过依赖注入实现的. 依赖注 ...

  4. 认识Spring核心容器IoC/DI

    对于 Java 编程来说,使用 Spring 能完成的更加快速,更容易并更安全.Spring 专注于速度,便捷与开发效率,也正是如此,让Spring成为了全世界最流行的 Java 框架.从配置到安全, ...

  5. 【闲谈】论Spring的三种依赖注入方式

    知识点科普: IOC和DI:IOC是控制反转,DI是依赖注入.DI是行为,而IOC是实现这一行为的容器. 循环依赖:指类与类之间互相依赖的情况,比如有类A和类B,类A中依赖类B,类B中依赖类A,由此导 ...

  6. Spring学习二创建对象,Spring的配置,Bean注入方式

    **1.Spring Ioc**创建对象的方式 构造方法创建对象: 1.使用无参构造创建对象,是默认实现: 2.若使用有参构造创建对象,则: 补充一个,导入junit包 <dependency& ...

  7. 学习Spring必须了解的DI注入------zjp

    第一节 DI依赖注入 [1]为什么使用DI(依赖注入) 作用:给对象中的全局属性或者对象进行赋值的操作 [2]利用DI进行解决 英文全称(Dependency Injection) 中文名称:依赖注入 ...

  8. Spring常用的三种注入方式

    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入. 构造方法注入 先简单看一下测试项目的结构,用maven构建的,四个包 ...

  9. Spring的两种属性注入方式

    Spring包下载地址:http://repo.spring.io/release/org/springframework/spring/ jar包下载:http://www.manyjar.com/ ...

最新文章

  1. QTableView中使用Delegate方式来实现对特定列的文本进行换行
  2. 编译原理三大经典书籍(龙书 虎书 鲸书)
  3. Repeater的使用
  4. Tips of keras
  5. 数学建模大赛考什么计算机基础知识,华为杯数学建模竞赛
  6. Qingdao Panda进阶之路
  7. console口 - 配置口
  8. html把图片放到文章右边,怎么在文章中把图片放在文字的左边、右边、中 – 手机爱问...
  9. python如何打印26个字母_python3打印26个英文字母
  10. [翻译]Orchard如何工作
  11. 2021年全球圆锥破碎机收入大约1357.4百万美元,预计2028年达到1665.6百万美元
  12. pandas 中处理日期相减问题
  13. Scala:Map集合的使用
  14. HTML5规定的行为,不遵循Html5规则的行为都是耍流氓
  15. 爽啊!写了一个网页:首字母索引的单词(十分垃圾,简单的不得了)
  16. android CMWAP, CMNET有何区别
  17. android+主流品牌手机,9月Android手机品牌及机型排行报告发布
  18. iptables 设置端口转发/映射
  19. Voxel-RCNN
  20. Cannot open channel to 2 at election address zj03/192.168.8.132:3888

热门文章

  1. 带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动
  2. React 快速上手 - 目录索引
  3. 饿了么前端DEMO 网址 VUE.js
  4. 红帽和Mirantis宣告结束OpenStack合作
  5. centos7 安装java 8_CentOS 7.8下安装完美安装配置Rosetta
  6. vue新手开源_开源新手宣布:征集作家
  7. (22)css3新增边框圆角属性border-radius
  8. ES5常用的组合继承及原型链理解
  9. Bootstrap创建进度条
  10. es6 WeakSet