Sprint.Net ——依赖注入

    xiaoxiao2022-06-30  63

    1.首先我们创建一个控制台应用程序,并且添加Spring.Aop,Spring.Core,Spring.Data,Common.Loggin四个dll文件

    2.创建Person实体类

     

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SpringNetIocExample { public class Person { public string Name { get; set; } public int Age { get; set; } public Person Friend { get; set; } } }

    3.创建PersonInitializtion类

     

     

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SpringNetIocExample { public class PersonInitializtion { private Person argPerson; private int intProp; public PersonInitializtion(Person argPerson, int intProp) { this.argPerson = argPerson; this.intProp = intProp; } public void WriteLine() { Console.WriteLine(intProp); //构造函数注入的整型参数 Console.WriteLine(string.Format("intProp:{0}", intProp)); //构造函数注入的Person Console.WriteLine(string.Format("argPerson Name:{0}", argPerson.Name)); Console.WriteLine(string.Format("argPerson Age:{0}", argPerson.Age)); //内联对象Friend Console.WriteLine(string.Format("argPerson Friend Name:{0}", argPerson.Friend.Name)); Console.WriteLine(string.Format("argPerson Friend Age:{0}", argPerson.Friend.Age)); //内联对象的循环引用 Console.WriteLine(string.Format("argPerson Friend Friend Name:{0}", argPerson.Friend.Friend.Name)); Console.WriteLine(string.Format("argPerson Friend Friend Age:{0}", argPerson.Friend.Friend.Age)); } } }

    4.将app.config文件中的内容替换如下

     

     

    <?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" /> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections> <spring> <context> <resource uri="config://spring/objects" /> </context> <objects xmlns="http://www.springframework.net"> <object id="person" type="SpringNetIocExample.Person,SpringNetIocExample"> <!--属性值类型注入--> <property name="Name" value="jackyong"/> <property name="Age" value="25"/> <!--内联对象注入--> <property name="Friend"> <object type="SpringNetIocExample.Person, SpringNetIocExample"> <property name="Name" value="jackpeng"/> <property name="Age" value="23"/> <property name="Friend" ref="person"/> </object> </property> </object> <object id="PersonInitializtion" type=" SpringNetIocExample.PersonInitializtion, SpringNetIocExample"> <!--构造器注入--> <constructor-arg name="argPerson" ref="person"/> <constructor-arg name="intProp" value="1"/> </object> </objects> </spring> </configuration>

    5.替换program类中Main方法中的内容如下

     

     

               IApplicationContext ctx = ContextRegistry.GetContext();             //属性注入 Person person = ctx.GetObject("person") as Person; Console.WriteLine("person name:"+person.Name); Console.WriteLine("person age:" + person.Age);             //构造器注入 PersonInitializtion initializtion = ctx.GetObject("PersonInitializtion") as PersonInitializtion; initializtion.WriteLine();

    运行结果如下:

     

    结果出来了,下面我们来详细解释一下依赖注入:

    主要分为属性注入和构造器注入

    1.属性注入:

     

    <object id="person" type="SpringNetIocExample.Person,SpringNetIocExample"> <!--属性值类型注入--> <property name="Name" value="jackyong"/> <property name="Age" value="25"/> </object>

    SpringNetIocExample.Person是程序集的名称加上类名,后面的SpringNetIocExample是当前程序集的名称

     

    property节点中name是对象的属性,value是要给该属性赋的值

    2.构造器注入

     

    <object id="PersonInitializtion" type=" SpringNetIocExample.PersonInitializtion, SpringNetIocExample"> <!--构造器注入--> <constructor-arg name="argPerson" ref="person"/> <constructor-arg name="intProp" value="1"/> </object>

     

     

    使用constructor-arg标签作为标示,同样具有于属性注入相同的方式,使用name,ref,value作为构造器注入的属性。

    constructor-arg节点中name同样代表类中的属性,value是要给该属性赋的值,ref 是用来表示是关联到哪个object

     

     

    ContextRegistry.GetContext()方法:

    该方法是获取配置文件中的如下内容,且把它们装入容器中,在配置这段xml信息时,spring和context节点的名称不是任意的,必须是"spring"和"context",Spring.NET本身将"spring/context"作为字符串常量定义在了AbstractApplicationContext类中以表示上下文的节点名称

     

    <spring> <context> <resource uri="config://spring/objects" /> </context> <objects xmlns="http://www.springframework.net"> <object id="person" type="SpringNetIocExample.Person,SpringNetIocExample"> <!--属性值类型注入--> <property name="Name" value="jackyong"/> <property name="Age" value="25"/> <!--内联对象注入--> <property name="Friend"> <object type="SpringNetIocExample.Person, SpringNetIocExample"> <property name="Name" value="jackpeng"/> <property name="Age" value="23"/> <property name="Friend" ref="person"/> </object> </property> </object> <object id="PersonInitializtion" type=" SpringNetIocExample.PersonInitializtion, SpringNetIocExample"> <!--构造器注入--> <constructor-arg name="argPerson" ref="person"/> <constructor-arg name="intProp" value="1"/> </object> </objects> </spring>

     

     

     

    Person person = ctx.GetObject("person") as Person;

    这句代码就是从容器中寻找id 为person的object(包含了所有的子节点),将其实例化为person,此时person实例的所有属性已经被赋值了

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1125934.html

    最新回复(0)