spring.net (3)依赖注入基础
属性的注入:
在上篇例子中已经出现并解释过:
<object id="dog" type="SpringDemo.Dog,SpringDemo" singleton="true">
<property name="name" value="旺财"></property>
</object>
或者 其中 <property name="name" value="旺财"></property>即使属性的注入 还有一种方式:
<object id="person" type="SpringDemo.Person,SpringDemo" singleton="true" >
<property name="pet" ref="dog" ></property> </object>
使用ref 标识是关联到哪个object
作为内联类型可以使用如下:
<property name="pet" >
<object type="SpringDemo.Dog,SpringDemo">
</object>
</property>
构造函数注入:
构造器注入使用constructor-arg标签作为标识。同样具有于属性注入相同的方式,使用name、ref、value作为构造器注入的属性,如下:
<constructor-arg name="pet" ref="person"/>
<constructor-arg name="age" value="1"/>
集合类型的注入:
IDictionary类型
使用<dictionary>元素来表示IDictionary接口的实现类型。<entry/>表示IDictionary集合的元素。key和value属性为元素的键值队,value-ref为关联的元素。
同理,<dictionary>元素的key-type和value-type属性来表示泛型IDictionary,例如 <dictionary key-type="string" value-type="object"> 。
ILIst类型
使用<list>元素作为ILIst的标签,value为集合中元素的值。也可以注入对象,甚至关联其它对象,使用 <ref/>元素表示关联的对象,object 属性为所关联对象的id或name。集合可以为空,用<null/>元素来标记。
在<list>元素中设置 element-type 属性表示泛型T的类型,例如 element-type="int" ,代表int型。
方法的注入:
查询方法的注入:
public class PersonDao
{
public void SaveMoney()
{
Console.WriteLine("存了点money");
}
}
public abstract class ObjectFactory
{
public abstract PersonDao CreatePersonDao();
}
<object id="persondao" type="SpringDemo.PersonDao,SpringDemo"></object>
<object id="objectfactory" type="SpringDemo.ObjectFactory,SpringDemo">
<lookup-method name="CreatePersonDao" object="persondao"/>
</object>
调用:
ObjectFactory factory = ctx.GetObject("objectfactory") as ObjectFactory;
factory.CreatePersonDao().SaveMoney();
Console.WriteLine();
执行结果:

Lookup Method Injection:看了上面的例子再解释会明朗一些。
查询方法XML配置的lookup-method name中配置的方法名,一定会返回object中配置的对象。
Spring.Net可以对动态的对目标对象的抽象方法或者虚方法进行覆盖,并且可以在容器类查找已命名的对象,查询方法注入就利用了这一功能。被查询的对象一般应该是非Singleton的,但是也可以是Singleton的。Spring.NET使用System.Reflecttion.Emit命名空间中的类型在运行时动态生成某个类的子类并覆盖其方法,以实现查询方法注入。被注入的方法应该是抽象无参数的或者虚方法,并且方法的可见性应该在Private以上(因为抽象方法或者虚方法设置为private就没有意义)。
替换任意方法:
public class ManyRun : IMethodReplacer
{ public object Implement(object target, MethodInfo method, object[] arguments)
{ string value = (string)arguments[];
return "获取到:" + value;
}
}
继承 IMethodReplacer接口和 Implement方法 并实现方法
public class Dog : Pet
{
public string name { get; set; }
public void bark()
{
Console.WriteLine("汪汪汪汪汪汪汪汪汪...");
}
public virtual string run(string str)
{
Console.WriteLine(name+ "蹦跶蹦跶的跑..."+str);
return name + "蹦跶蹦跶的跑..." + str;
}
}
dog有个run方法:
代码如下:
<object id="dog" type="SpringDemo.Dog,SpringDemo" singleton="true">
<property name="name" value="旺财"></property>
<replaced-method name="run" replacer="manyrun" >
<arg-type match="String"/>
</replaced-method> </object>
<object id="manyrun" type="SpringDemo.ManyRun,SpringDemo"></object>
调用:
Dog dog = ctx.GetObject("dog") as Dog;
Console.WriteLine(dog.run("凌波微步。。。"));

事件注入:
在listener节点处配置event和method属性指明事件名和绑定的方法,并增加ref节点设置object属性来指明调用哪个IoC容器对象。
代码:
//先定义一个委托
public delegate object frisbeehandler(object obj); public class Dog : Pet
{
public string name { get; set; }
public void bark()
{
Console.WriteLine("汪汪汪汪汪汪汪汪汪...");
}
public virtual string run(string str)
{
Console.WriteLine(name+ "蹦跶蹦跶的跑..."+str);
return name + "蹦跶蹦跶的跑..." + str;
}
public event frisbeehandler frisbeefly;
public void chasefrisbee(object obj)
{
//调用事件
if (frisbeefly != null)
{
Console.WriteLine(frisbeefly(obj).ToString());
}
}
~Dog()
{
Console.WriteLine("Dog销毁");
}
public class Person
{
public string name { get; set; }
public Pet pet { get; set; }
public void orderPet(string type)
{
Console.WriteLine("start order");
if (type.ToLower() == "bark")
{
Console.WriteLine(string.Format("I`m {0},{1} is me", pet.GetType().ToString(), pet.name));
Console.WriteLine(string.Format("time:{0}", DateTime.Now.ToString()));
if (pet.name == "旺财")
{
pet.name += "";
}
pet.bark();
}
Console.WriteLine("end order");
}
public object seefrisbee(object color)
{
return string.Format("{0}看到{1}追着{2}颜色的飞盘", name,pet.name,color);
}
~Person()
{
Console.WriteLine(name + "离开");
}
}
<object id="person" type="SpringDemo.Person,SpringDemo" singleton="true" >
<property name="pet" ref="dog" ></property>
<property name="name" value="Yahue"></property>
<listener event="frisbeefly" method="seefrisbee">
<ref object="dog"/>
</listener>
</object>
<object id="dog" type="SpringDemo.Dog,SpringDemo" singleton="true">
<property name="name" value="旺财"></property>
<replaced-method name="run" replacer="manyrun" >
<arg-type match="String"/>
</replaced-method> </object>
<object id="manyrun" type="SpringDemo.ManyRun,SpringDemo"></object>
调用代码:
Dog dog = ctx.GetObject("dog") as Dog;
dog.chasefrisbee("红色");
执行结果:

spring.net (3)依赖注入基础的更多相关文章
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- 谈谈自己了解的spring.NET的依赖注入
spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序 ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- spring六种种依赖注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- spring.NET的依赖注入
谈谈自己了解的spring.NET的依赖注入 spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection), ...
- 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.不知 ...
随机推荐
- [Java 进阶]异常
异常:程序在运行过程中发生由于硬件设备问题.软件设计错误等导致的程序异常事件. 世上没有百分之百完美的程序.程序总难免存在各式各样的问题.所以,程序中添加对于错误的处理机制是十分有必要的.这就好比人多 ...
- 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要四
又是一个周末,刚好有时间,又继续复习与总结了,希望能让大家受益,不足之处欢迎指正,谢谢! 十八. Lambda 1.Lambda表达式:匿名方法的另一种表现形式,它可以包含表达式和语句,且用于创建委托 ...
- Winform开发框架之读卡器和条码扫描枪的数据接收处理
在我们开发一些项目的时候,一般需要一些外围的设备进行数据处理,如ID/IC读卡器获取卡号.激光条码扫描枪.USB摄像头.USB方式的小票据打印机(POS打印机).USB来电录音盒.普通打印机等一系列附 ...
- C#编程总结(八)数字签名
C#编程总结(八)数字签名 在日常工作中,有很多文件需要领导审阅.签名和盖章,由于公司业务开展,跨地域.跨国业务也日益普遍,领导签名盖章变得很麻烦,开始的时候人们通过邮寄.传真等方式来解决,但是耗费时 ...
- IIS 7.5 应用程序池预热模块组件
预热组件下载地址:下载地址 IIS预热模块配置界面插件:下载地址 Warm Up设定方式: (1) 应用程序池层级:只要有需要的应用程序池的Start Mode设定AlwaysRunning就可以 ( ...
- 清除svn账户账号密码
1. 2. 3. 4. 5.再次访问时,会弹出要求输入用户名和密码:只是清除记住的用户名和密码.
- 使用List把一个长字符串分解成若干个短字符串
把一个长字符串分解成若干个固定长度的短字符串,由于事先不知道长字符串的长度,以及短字符串的数量,只能使用List. public static void get_list_sbody(String s ...
- ListView 下拉更新 (支持 Android)
注意:XE7 已提供下拉更的功能. 说明:展示如何在 Android 平台下,使用 ListView 下拉更新. 适用:Delphi XE5 , XE6 修改:需要修改到 Delphi 源码 FMX. ...
- ServletContext与网站计数器
什么是ServletContext? ServletContext是服务器的一个公用的空间,是不同的浏览器共享的一个数据. 由图可以看出ServletContext和Cookie与session之间的 ...
- 关于HTML面试题汇总之visibility
一.页面可见性(visibility) 主要提供两个属性,一个事件(都在document对象上):1. 属性: 1.1. hidden:获取或设置当前页面的可见性,boolean值: 1.2 ...