一 簡單介紹
IOC 控制轉移,就是將創建放到容器里,從而達到接耦合的目的,DI是 在容器創建對象的時候,DI讀取配置文件,然后給對象賦默認值,兩者一般結合使用,實現注入。
Spring.Net的功能:自動裝配、屬性和構造器參數依賴注入、依賴檢查、生命周期接口等等,使用起來感覺更多的是配置,非常關鍵的就是App.Config配置文件
技術使用的場景:在需要進行模塊之間解耦操作的時候可以用到,一般的解耦操作用的都是面向接口編程,從而達到模塊之間的解耦,解耦的意思就是:即使下一級模塊修改后,依賴它的上一級模塊也不需要改變,這就是解耦了。通常的做法,其中一種做法是,先抽象下一級模塊的接口,在下一級模塊和上一級模塊之間創建一個工廠模塊,上一級使用下一級抽象出的接口進行編程,實例使用工廠模塊進行實例。工廠模塊實例的方法有很多,簡單的是直接實例,高級的是通過反射進行實例。具體可以在工廠模式中了解,之后也會針對幾種設計模式寫博文,緊急需要的可以給我留言,可以將我的個人總結發給你先。
從上面的介紹,這個方法其實挺麻煩的,而使用spring.net則相對簡單很多,簡單配置就可以達到效果。
本文只是入門,更深入的學習請通過API文檔進行詳細學習。
關於Spring.Net的缺點也是不得不提到的,Spring.Net本質畢竟還是反射,性能方面會有些損失,不適合對性能要求高的大訪問量的互聯網項目,不過在企業級應用中,OA系統,HR系統,都是完全沒有問題的,以及訪問量中等的,起碼幾千人在線訪問,也不是有很大問題,具體使用,需要斟酌。
二 創建對象,以及設置屬性
下載好Spring.Net,新建項目
一般在目錄下 \Spring.NET-2.0.0-M1\Spring.NET\bin\net\4.0\release,下面是一堆得dll,下面就可以可是新建項目測試了
新建一個控制台
主要使用 Common.Logging.dll 日志,Spring.Core.dll 核心庫

先修改App.config
<? xml version =" 1.0 " encoding =" utf-8 " ?> < configuration> < configSections> < sectionGroup name = "spring " > <!-- 這下面有context和object在下面都有對象的標簽 --> < section name = "context " type = "Spring.Context.Support.ContextHandler, Spring.Core " /> < section name = "objects " type = "Spring.Context.Support.DefaultSectionHandler, Spring.Core " /> </ sectionGroup > </ configSections> < spring> <!-- Spring.Net對象容器的配置 --> < context > <!-- 容器的所有的對象在哪里,這里用uri說明地址 --> < resource uri = "config://spring/objects " /> <!-- 可以使用外部xml文件 --> </ context > <!-- objects:配置的容器里面的對象 --> < objects xmlns = "http://www.springframework.net " > < description >An example that demonstrates simple IoC features. </ description> <!-- name最好用類名,type第一個是類的全稱加上程序集,后面一個是項目名稱 --> < object name = "UserInfoDal " type = "SpringNetDemo.UserInfoDal, SpringNetDemo " > <!-- 在這里是設置對象的屬性,將Name的值設置成ctt --> < property name = "Name " value = "ctt " /> </ object > </ objects > </ spring> </ configuration>
這里注意:配置放在<startup>標簽后面會報錯 “Spring.Context.Support.ContextRegistry”的類型初始值設定項引發異常,放在<startup>標簽前面就可以了。
public class UserInfoDal : IUserInfoDal { public string Name { get; set; } public void Show() { Console .WriteLine("zjh and "+Name ); } }
Program里面
class Program { static void Main(string [] args) { //IApplicationContext是Spring里面的一個超類,主要操作類 IApplicationContext ctx = ContextRegistry .GetContext(); //GetObject從配置文件中讀取信息后,反射產生相應的對象,用as強轉成對象的接口 IUserInfoDal userInfoDal = ctx.GetObject("UserInfoDal" ) as IUserInfoDal; //輕松加愉快,就這樣出來了 userInfoDal.Show(); Console .ReadKey(); } }
結果 zjh and ctt
三 創建復雜屬性的設置
創建一個服務測試類
public class UserInfoService { public IUserInfoDal UserInfoDal { get ; set; } public void Show() { UserInfoDal.Show(); Console .WriteLine("it is service" ); } }
配置文件配置
<? xml version =" 1.0 " encoding =" utf-8 " ?> < configuration> < configSections> < sectionGroup name = "spring " > <!-- 這下面有context和object在下面都有對象的標簽 --> < section name = "context " type = "Spring.Context.Support.ContextHandler, Spring.Core " /> < section name = "objects " type = "Spring.Context.Support.DefaultSectionHandler, Spring.Core " /> </ sectionGroup > </ configSections> < spring> <!-- Spring.Net對象容器的配置 --> < context > <!-- 容器的所有的對象在哪里,這里用uri說明 --> < resource uri = "config://spring/objects " /> <!-- 可以使用外部xml文件 --> </ context > <!-- objects:配置的容器里面的對象 --> < objects xmlns = "http://www.springframework.net " > < description >An example that demonstrates simple IoC features. </ description> <!-- name最好用類名,type第一個是類的全稱加上程序集,后面一個是項目名稱 --> < object name = "UserInfoDal " type = "SprintNetDemo.UserInfoDal, SprintNetDemo " > <!-- 在這里是設置對象的屬性,將Name的值設置成ctt --> < property name = "Name " value = "ctt " /> </ object > <!-- 在這里配置UserInfoService對象 --> < object name = "UserInfoService " type = "SprintNetDemo.UserInfoService, SprintNetDemo " > <!-- 在這里配置UserInfoService對象的UserInfoDal屬性,執行上面產生的對象 --> < property name = "UserInfoDal " ref = "UserInfoDal " /> </ object > </ objects > </ spring> </ configuration>
program代碼
static void Main( string[] args) { //IApplicationContext是Spring里面的一個超類,主要操作類 IApplicationContext ctx = ContextRegistry .GetContext(); //創建出對象,主要在配置文件中對UserInfoService的UserInfoDal屬性進行復制 UserInfoService userInfoService = ctx.GetObject( "UserInfoService" ) as UserInfoService; userInfoService.Show(); Console.ReadKey(); }
結果
zjh and ctt
it is service
it is service
四 總結
本文主要,簡單地講解了一些Spring.Net的例子,我這次也是項目中用到了,將自己的一些使用心得寫出來,雖然例子比較簡單,但是還是可以看出Spring.Net的強大之處,當然這里介紹的只是冰山一角。
Spring.Net的中文文檔,2007就沒有再更新過了,如果大家想進一步學習,推薦閱讀英文文檔,當然英文不太好,閱讀java的spring一樣樣的,嘿嘿,java有中文文檔喲。
如果有錯誤,歡迎指出來,謝謝。