Spring.Net---4、IoC/DI注入方式
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类实现接口对象Tool
Service.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 +" 性别:"+ item.Sex);
}
//输出List<string>
string output=string.Empty;
foreach (var item in p.WeekWorkDay)
{
output += item + " ";
}
Response.Write("<br/> 每周在" + output + "工作");
output = string.Empty;
//输出IList
foreach (var item in p.Hobbys)
{
output += item + " ";
}
Response.Write("<br/> 爱好为" + 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
Spring.Net---4、IoC/DI注入方式的更多相关文章
- Spring Bean基本管理--bean注入方式汇总
依赖注入方式:Spring支持两种依赖注入方式,分别是属性注入和构造函数注入.还有工厂方法注入方式. 依赖注入还分为:注入依赖对象可以采用手工装配或自动装配,在实际应用开发中建议使用手工装配,因为自动 ...
- JAVAWEB 一一 框架整合(SSH,Spring+Struts2+Hibernate IOC/DI AOP声明式事务处理 定时任务)
package org.springframework.orm.hibernate3; import java.io.Serializable; import java.util.List; impo ...
- Spring学习-spring核心机制-IOC依赖注入
转载自:http://www.cnblogs.com/chenssy/archive/2012/11/11/2765266.html 今天复习一下spring两大特性之一:IOC依赖注入,看了一下大佬 ...
- spring 学习之 bean 的注入方式 property和constructor-arg的使用方式
spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...
- Spring常用的三种注入方式
好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入 ...
- 十七、Spring框架(IOC/DI)
一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...
- spring 学习 二 IOC/DI
中文名称:控制反转 英文名称:( Inversion of Control ) 1 控制反转作用: 一般在编写java程序时,需要程序员自己创建对象的实例,例如 A a=new A();语句,就是程序 ...
- Spring.Net---3、IoC/DI深入理解
------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...
- SSM-Spring-07:Spring基于注解的di注入
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解: 说起注解,哇哦,每个人都或多或少的用到过 像什么@Overried,@Test,@Param等等之前就 ...
随机推荐
- Neutorn LBaaS 原理
Load Balance as a Service(LBaaS)是 Neutron 提供的一项高级网络服务.LBaaS 允许租户在自己的网络中创建和管理 load balancer. load bal ...
- var在PHP和JS中的使用
一,var在PHP中的使用 var在PHP中使用很少,只在类中声明成员变量时候,可以使用var,其相当于public,而且以后逐渐用public替代var,所以在PHP中尽量不使用var声明变量. 二 ...
- 教你玩转XSS漏洞
什么是存储性XSS那? 通俗理解就是”xss“语句存在服务器上,可以一直被客户端浏览使用,所有登陆某一个存在”存储性xss“的页面的人,都会中招,可以是管理员,可以是普通的用户,所以他的危害是持续性的 ...
- Win10桌面图标无法拖动
1.右键桌面>查看>取消自动排列 2.桌面多按几次Esc 3.gpedit.msc “用户配置/管理模板/Windows组件/任务计划程序/禁止拖放>改为未配置
- python --爬虫--爬取百度翻译
import requestsimport json class baidufanyi: def __init__(self, trans_str): self.lang_detect_url = ' ...
- Jupyter notebook用法
参考官网文档:https://jupyter-notebook.readthedocs.io/en/stable/public_server.html 0.介绍jupyter notebook (此前 ...
- [原创] Trie树 php 实现敏感词过滤
目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...
- Python:学习遇到的小问题:记事本写的脚本执行提示SystaxError:(unicode error) 'utf-8'
学习了一段时间的Python因为懒没有坚持,现在又想学,在用记事本写好py脚本运行时报错:SystaxError:(unicode error) 'utf-8' 解决的方法: 因为我的笔记本系统自带的 ...
- 威尔逊定理--HDU2973
参考博客 HDU-2973 题目 Problem Description The math department has been having problems lately. Due to imm ...
- 那些H5用到的技术(6)——数字滚动特效
前言原理源码使用方式补充CountUp.js 前言 会有这么一种情况,H5页面需要进行数字统计展示,以此来强调产品or工作的成果.如果只是静态显示一个数字,总是感觉生硬.对比如下: 是不是瞬间高大上了 ...