谈谈自己了解的spring.NET的依赖注入
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的依赖注入的更多相关文章
- spring.NET的依赖注入
谈谈自己了解的spring.NET的依赖注入 spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection), ...
- spring六种种依赖注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- spring 四种依赖注入方式以及注解注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- Spring学习(一)——Spring中的依赖注入简介
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
随机推荐
- Hibernate day03笔记
Hibernate的关联关系映射:(多对多) 多对多的配置: 步骤一创建实体和映射: Student: public class Student { private Integer sid ...
- List集合转换为数组形式
通过List集合对象的转类型函数 .ToArray() 如List<decimal> → deciaml[] 代码如下: var ComIdList = ComList.Select(p ...
- avalon2学习教程09循环操作
avalon2的循环指令的用法完全改变了.avalon最早期从knockout那样抄来ms-each,ms-with,分别用于数组循环与对象循环.它们都是针对元素内容进行循环.后来又从angular那 ...
- .net正则表达式
1. "^-?[1-9]\\d*$",//整数 2. "^[1-9]\\d*$", //正整数 3. intege2:"^-[1-9]\\d*$&qu ...
- bs4的学习
soup = BeautifulSoup(html,'html.parser') #'html.parser'是html解析器必须有soup.find_all("a") #等价于 ...
- clone()与clone(true)的区别
clone()方法用于复制一个元素,但是被复制出来的元素不具备复制的功能,如果希望被复制出来的元素也具备复制的功能,需要给clone()方法加上true这个参数,即clone(true). 例如: & ...
- 使用ssh-keygen设置ssh无密码登录
http://lhflinux.blog.51cto.com/1961662/526122 ssh-keygen -t rsa 输入后,会提示创建.ssh/id_rsa.id_rsa.pub的文件,其 ...
- Delphi下使用Oracle Access控件组下TOraSession控件链接
Delphi下使用Oracle Access控件组下TOraSession控件链接数据库,使用 orsn1.Options.Direct:=true; orsn1.Server:=IP:Port: ...
- android APK应用安装过程以及默认安装路径[转]
一:安装过程 APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. Android应用安装有如下四种方式 1. ...
- PHP--目录处理
__file___ dirname(): dirname()与__file__的组合:dirname(__file__)