Spring.NET依赖注入框架学习--简单对象注入
在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入
常用文件
我们使用Spring.Net 框架经常要使用到的是以下文件:
- Common.Logging.dll 包含了Spring.Net日志方面的功能(必须)
- Spring.Core.dll 包含了Spring.Net 的核心库(必须)
- Spring.Data.dll 包含了Spring.Net 的数据访问功能
- Spring.Aop. dll 包含了Spring.Net 对面向切面编程(AOP)的支持
- Spring.Web.dll 包含了Spring.Net 对ASP.NET进行了一系列功能扩展
Spring.NET常用接口
IObjectFactory和IApplicationContext
IObjectFactory接口提供了一种高级配置机制,可以管理任何类型的对象,提供了配置框架和基本功能。
IApplicationContext是IObjectFactory的子接口,表示Spring IoC容器,负责在应用程序中实例化,配置和组装许多对象。容器通过读取配置元数据获取对象的实例化,配置和组装。配置元数据以XML表示。它增加了与Spring.NET面向方面编程(AOP)功能,消息资源处理(用于国际化),事件传播和Web应用程序上下文(如Web应用程序上下文)在Web应用程序中使用的更容易的集成,IApplicationContext增加了更多的企业特定功能。 IApplicationContext是IObjectFactory的一个完整的超集。
Spring.NET提供了几个IApplicationContext接口的实现。在独立的应用程序中,通常在应用程序的App.config文件中以编程方式或声明方式创建XmlApplicationContext的实例。
在Web应用程序中,Spring提供了一个WebApplicationContext实现,该实现通过在Web.config文件中添加自定义HTTP模块和HTTP处理程序来配置
下图是Spring.NET的工作原理图
如上图所示,Spring.NET IoC容器使用一种形式的配置元数据;这个配置元数据表示作为应用程序开发人员如何告诉Spring容器在应用程序中实例化,配置和组装对象。配置元数据以简单直观的XML格式提供
Spring.Net 的配置介绍
Spring.Net 的配置文件(一般情况下加入到App.Config或者Web.Config中)内容如下都是XML文件格式
配置文件中必须要要具有的节点
spring结点
spring结点 方式一
<spring> <context type="Spring.Context.Support.XmlApplicationContext, Spring.Core"> <resource uri="file://objects.xml"/> <resource uri="assembly://MyAssembly/MyProject/objects-dal-layer.xml"/> </context> </spring>
spring结点 方式二
<spring> <context> <resource uri="file://objects.xml"/> <resource uri="assembly://MyAssembly/MyProject/objects-dal-layer.xml"/> </context> </spring>
<context>节点的type属性是可选的,在Windows应用中,其默认值就是Spring.Context.Support.XmlApplicationContext,所以方式一和方式二完全相同
spring和context节点的名称不是任意的,必须是"spring"和"context",Spring.NET本身将"spring/context"作为字符串常量定义在了AbstractApplicationContext类中以表示上下文的节点名称所以这个结点名称是不能随便改的,若要引用由以上配置创建的容器,可使用下面的代码:
IApplicationContext ctx = ContextRegistry.GetContext();
ContextRegistry类既可用来初始化应用程序上下文,也可用来以服务定位器风格对容器中的对象进行访问,注意,使这一切成为可能的是Spring.Context.Support.ContextHandler类,该类实现了FCL的IConfigurationSectionHandler接口。必须在.NET配置文件的<configSections>节点中注册这个类,注册了这个节点处理器后,配置文件中的<spring>节点才能起作用,如下所示:
configSections结点
<configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> </sectionGroup> </configSections>
源数据对象xml文件格式
<objects xmlns="http://www.springframework.net"> <object id="..." type="..."> <!-- collaborators and configuration for this object go here --> </object> <object id="...." type="..."> <!-- collaborators and configuration for this object go here --> </object> <!-- more object definitions go here --> </objects>
id属性是用来标识单个对象定义的字符串。 type属性定义对象的类型,并使用完全限定的类型名称,包括程序集名称。
<object id="对象名称" type="命名空间.类名,程序集名称"> //对象成员 </object>
实例介绍
Person.cs
/***************************************************** * ProjectName: Spring.NET01 * Description: * ClassName: Person * CLRVersion: 4.0.30319.42000 * Author: JiYF * NameSpace: Spring.NET01 * MachineName: JIYF_PC * CreateTime: 2018/1/14 11:59:12 * UpdatedTime: 2018/1/14 11:59:12 *****************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Spring.NET01 { public class Person { public Person() { } ~Person() { } public void print() { Console.WriteLine("我是一个Person对象"); } } }
根据配置文件格式我们配置一个Person对象
App.config文件
<?xml version="1.0" encoding="utf-8" ?> <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"></resource> </context> <objects xmlns="http://www.springframework.net"> <!--一个person对象--> <object id="person1" type="Spring.NET01.Person,Spring.NET01"> </object> </objects> </spring> </configuration>
通过Sprint.NET容器注入对象
第一步引用Spring.NET动态库文件,这里只需要引用Spring.Core.dll 和Common.Logging.dll动态库文件即可
代码测试:
class Program { static void Main(string[] args) { //普通对象创建 Person person = new Person(); person.print(); //通过Spring.NET ioc注入对象 IApplicationContext ctx = ContextRegistry.GetContext(); Person bennanhai = (Person)ctx.GetObject("person1"); bennanhai.print(); Console.Read(); } }
执行结果:
这样一个简单的依赖注入例子就实现了