Spring.Net框架介紹及基本配置(學習筆記一)
Spring.NET是一個應用程序框架,其目的是協助開發人員創建企業級的.NET應用程序。它提供了很多方面的功能,比如依賴注入、面向方面編程(AOP)、數據訪問抽象及ASP.NET擴展等等。Spring.NET以Java版的Spring框架為基礎,將Spring.Java的核心概念與思想移植到了.NET平臺上。
Spring作為實現IOC或者說是DI的一種框架,為我們更好的降低程序的耦合性提供了一種方便的處理方式。當然也有其他一些實現IOC的框架如微軟的Unity。至于何謂IOC、DI我這里也就不介紹了。有興趣可以參考http://student.csdn.net/space.php?uid=706796&do=blog&id=39000
首先聲明,我寫這個系列并不是因為自己很精通。只是自己的一個學習過程。如果有什么不對的地方,往專家踴躍拍磚!
本節要點:
1、Spring整體框架介紹
2、Spring基本配置
3、Spring注入方式
4、配置的使用
首先:我使用的Spring的版本為:Spring1.3。開發工具為:VS2008
學習Spring,首先得學會如何配置它。可以從官網下載最新的安裝包www.springframework.net.
1、Spring的整體框架以及說明

Spring.Core作為整個框架的基礎,實現了依賴注入的功能。Spring.NET的大部分模塊都要依賴或擴展該模塊。Spring.Core的基礎是IObjectFactory接口,該接口用一個簡單而優雅的方式實現了工廠模式,使我們可以無需自行編寫singleton類型和眾多的服務定位器,并允許將對象配置及其依賴關系與具體的程序邏輯解耦。該模塊中的IApplicationContext接口是IObjectFactory的擴展,增加了諸多企業級功能,包括使用資源文件進行文本本地化、事件傳播和資源裝載等等。
Spring.AOP為業務對象提供面向方面編程(AOP)的支持。AOP完善了IoC容器的功能,為創建企業應用和使用聲明式服務奠定了堅實的基礎。
Spring.Web對ASP.NET進行了一系列功能擴展,包括對ASP.NET頁面進行依賴注入、雙向數據綁定、在ASP.NET 1.1中使用Master page、以及增強的本地化功能支持等。
Spring.Services允許將任意的“普通”對象(意為沒有繼承任何指定基類型的對象)發布為企業服務(COM+)或遠程對象。通過依賴注入和特性元數據覆蓋等功能,該模塊可使.NET的Web服務獲得極大的靈活性。同時也支持Windows后臺服務。
Spring.Data定義了一個抽象的數據訪問層,可以跨越各種數據訪問技術(從ADO.NET到各種ORM)進行數據訪問。該模塊包含一個ADO.NET的抽象層,減少了使用傳統ADO.NET進行編碼和事務管理時的工作量。
Spring.ORM為時下流行的ORM類庫提供了一個整合層,其中包含聲明式事務管理等諸多功能。
2、Spring基本配置:
Spring的配置比起NHibernate算是比較簡單了(個人意見)。同NHibernate一樣,它的配置文件也是用XML完成的。如果你想在手工書寫Spring配置文件時,有同NHibernate配置的智能感應一樣,那你需要將Spring安裝目錄下(Spring.NET 1.3.0\doc\schema)的XML結構文件拷貝到VS的安裝目錄的架構文件中如:C:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas。
Spring的配置中有幾個是必須的,并且在不同的應用中都一樣。如:
代碼
2 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
3
4 <spring>
5 <context>
6 <resource uri="config://spring/objects"/>
7 </context>
8 <objects xmlns="http://www.springframework.net" xmlns:aop="http://www.springframework.net/aop"></objects>
9 </spring>
其中,name屬性以及其類型都是固定配置,不可更改。context節點、objects也一樣。
其他的便是根據具體應用所進行的配置。
3、注入方式:
1、屬性注入
<property name="baz" ref="baz" ></property>
<property name="bar" ref="bar"></property>
2、構造注入
<constructor-arg name="_bar" ref="bar"></constructor-arg>
<constructor-arg name="_baz" ref="baz"></constructor-arg>
以上兩種配置根據類的有無屬性、構造函數進行。不過在其他資料中,別人說屬性注入的方式比較常用。
全部配置文件如下:
3、方法注入。
通過其他類的方法來構造對象。配置如下:
代碼
2 <lookup-method name="GetObject"object="target"/>
3 </object>
4
5 <object id="target" type ="ConsoleAppSpring.MethodInjection,ConsoleAppSpring" singleton="1">
6 <property name="Name" value="TestName"></property>
7 <property name="Age" value="38"></property>
8 </object>
注意:通過屬性注入時:類必須有無參數構造函數,否則會發生如下異常。通過構造注入時:可以無無參數構造函數,但是,構造屬性
constructor-arg 的name屬性值應為對應構造函數的參數
以上注入方式配置文件如下:
代碼
2 <configuration>
3 <configSections>
4 <sectionGroup name="spring">
5 <section name="context" type="Spring.Context.Support.ContextHandler,Spring.Core"/>
6 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler,Spring.Core"/>
7 </sectionGroup>
8 </configSections>
9
10
11 <spring>
12 <context>
13 <resource uri="config://spring/objects"/>
14 </context>
15
16 <objects xmlns="http://www.springframework.net" xmlns:aop="http://www.springframework.net/aop">
17 <object id="foo" type="ConsoleAppSpring.Foo,ConsoleAppSpring">
18 <property name="baz"ref="baz"></property>
19 <property name="bar"ref="bar"></property>
20 <!--<constructor-arg name="_bar"ref="bar"></constructor-arg>
21 <constructor-arg name="_baz"ref="baz"></constructor-arg>-->
22 </object>
23
24 <object id="bar" type="ConsoleAppSpring.Bar,ConsoleAppSpring">
25 <property name="Heigth" value="27"></property>
26 </object>
27 <object id="baz" type="ConsoleAppSpring.Baz,ConsoleAppSpring">
28 <property name ="Name">
29 <value>tyb</value>
30 </property>
31 </object>
32
33 <object id="objFactory" type="ConsoleAppSpring.InjectionFactory,ConsoleAppSpring">
34 <lookup-method name="GetObject"object="target"/>
35 </object>
36
37 <object id="target" type ="ConsoleAppSpring.MethodInjection,ConsoleAppSpring" singleton="1">
38 <property name="Name" value="TestName"></property>
39 <property name="Age" value="38"></property>
40 </object>
41
42
43 </objects>
44 </spring>
45 </configuration>
在Objects節點的子節點Object中,ID代表類的標識,type代表類的具體類型。具體Foo、Bar、Baz三個類的代碼一起給出:
代碼
{
publicclass Foo
{
public Bar bar { get; set; }
public Baz baz { get; set; }
public Foo()
{ }
public Foo(Bar _bar, Baz _baz)
{
bar = _bar;
baz = _baz;
}
}
}
namespace ConsoleAppSpring
{
publicclass Bar
{
publicstring Heigth { get; set; }
}
}
namespace ConsoleAppSpring
{
publicclass Baz
{
//public List<string> Name { get; set; }
publicstring Name { get; set; }
}
}
namespace ConsoleAppSpring
{
publicclass MethodInjection
{
publicstring Name { get; set; }
publicint Age { get; set; }
public MethodInjection()
{
}
public MethodInjection(string name, int age)
{
Name = name;
Age = age;
}
}
}
namespace ConsoleAppSpring
{
publicclass InjectionFactory
{
publicstring name ="method injection";
publicint age =32;
publicvirtualobject GetObject()
{
returnnew MethodInjection(name, age);
}
}
}
4、使用以上Spring的配置
代碼
2 {
3 IApplicationContext context = ContextRegistry.GetContext();
4 Foo foo = (Foo)context.GetObject("foo");
5 Console.WriteLine(foo.bar.Heigth);
6 Console.WriteLine(foo.baz.Name);
7
8 InjectionFactory factory = (InjectionFactory)context.GetObject("objFactory");
9 Console.WriteLine("factory name is"+ factory.name +"factory age is "+ factory.age);
10 MethodInjection injection = (MethodInjection)factory.GetObject();
11 Console.WriteLine("methodinjection name is {0}, age is {1}:" , injection.Name, injection.Age);
12 Console.ReadLine();
13
14 }
輸出如下:

由上圖可以看出MethodInjection的屬性還是配置文件給出的值,不會因為InjectionFactory而改變
說明:IApplicationContext 、ContextRegistry需要引入 Spring.Context、 Spring.Context.Support命名空間。安裝完Spring后,在安裝的目錄中能找到相應的程序集。IObjectFactory接口提供了配置框架和基本功能,IApplicationContext接口又在其基礎上擴展了許多企業級特性。可以說IApplicationContext是IObjectFactory的一個超集,具備IObjectFactory所有的功能與行為。ContextRegistry類既可用來初始化應用程序上下文,也可用來以服務定位器風格對容器中的對象進行訪問
參考:Spring.Net框架參考文檔
http://www.rzrgm.cn/goodHelper
附:源碼下載

浙公網安備 33010602011771號