属性的注入:

  在上篇例子中已经出现并解释过:

 <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)依赖注入基础的更多相关文章

  1. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转

    Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...

  2. 谈谈自己了解的spring.NET的依赖注入

         spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序 ...

  3. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  4. Spring学习(一)——Spring中的依赖注入简介【转】

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  5. spring六种种依赖注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  6. spring.NET的依赖注入

    谈谈自己了解的spring.NET的依赖注入   spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection), ...

  7. spring 四种依赖注入方式以及注解注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  8. JavaEE开发之Spring中的依赖注入与AOP

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  9. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  10. Spring学习(一)——Spring中的依赖注入简介

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

随机推荐

  1. redis学习之三配置文件redis.conf 的含义

    摘自http://www.runoob.com/redis/redis-conf.html 安装redis之后的第一件事,我就开始配置密码,结果总是不生效,而我居然还没想到原因.今天突然用命令行设置了 ...

  2. 为什么是梯度下降?SGD

    在机器学习算法中,为了优化损失函数loss function ,我们往往采用梯度下降算法来进行优化.举个例子: 线性SVM的得分函数和损失函数分别为:                         ...

  3. 第17/24周 悲观并发控制(Pessimistic Concurrency)

    大家好,欢迎回到性能调优培训.今天标志着第5个月培训的开始,这个月我们会谈论SQL Server里的锁.阻塞和死锁(Locking, Blocking, and Deadlocking). SQL S ...

  4. CSS魔法堂:你真的理解z-index吗?

    一.前言 假如只是开发简单的弹窗效果,懂得通过z-index来调整元素间的层叠关系就够了.但要将多个弹窗间层叠关系给处理好,那么充分理解z-index背后的原理及兼容性问题就是必要的知识储备了.本文作 ...

  5. Java魔法堂:枚举类型详解

    一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{ RED = , BLUE = } Console.Write ...

  6. 勤能补挫-简单But易错的JS&CSS问题总结

    错误频率较高的JS&CSS问题 勤能补拙,不管是哪门子技术,在实践中多多总结,开发效率慢慢就会提升.本篇介绍几个经常出错的JS&CSS问题,包括事件冒泡.(使用offset.scrol ...

  7. Auto Mapper02《demo》

         学习这些基本上网上都有一些教程或者别人做的demo,我是按照这个方式去学习的.先做个demo,学会如何去使用它,接着去慢慢的了解它是如何的运行的,理解里面的一些基本的基础知识.我们不可以再像 ...

  8. java中synchronized关键字的用法

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

  9. Java中多态的一些简单理解

    什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...

  10. Stream转MemoryStream解决Stream.Length报错此流不支持查找操作

    1.StreamToMemoryStream MemoryStream StreamToMemoryStream(Stream instream) { MemoryStream outstream = ...