Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和面向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架。
Spring模塊框架圖一覽:
首先先說說IoC(Inversion of Control,控制倒轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制對象的生命周期和對象間的關系。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪裡有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是復雜深奧的,我們必須自己設計和面對每個環節。傳統的程序開發也是如此,在一個對象中,如果要使用另外的對象,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將對象銷毀(比如Connection等),對象始終會和其他的接口或類藕合起來。
那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周傑倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明了,如果婚介給我們的人選不符合要求,我們就會拋出異常。整個過程不再由我自己控制,而是由婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring這是個什麼東西,你需要什麼東西,然後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也交給你需要的其他東西。所有的類的創建、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對於某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉。如果你還不明白的話,我決定放棄。
IoC的一個重點是在系統運行中,動態的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection,依賴注入)來實現的。比如對象A需要操作數據庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了 spring我們就只需要告訴spring,A中需要一個Connection,至於這個Connection怎麼構造,何時構造,A不需要知道。在系統運行時,spring會在適當的時候制造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個對象之間關系的控制。A需要依賴 Connection才能正常運行,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實現的呢? Java 1.3之後一個重要特征是反射(reflection),它允許程序在運行的時候動態的生成對象、執行對象的方法、改變對象的屬性,spring就是通過反射來實現注入的。關於反射的相關資料請查閱java doc。
理解了IoC和DI的概念後,一切都將變得簡單明了,剩下的工作只是在spring的框架中堆積木而已。
新建一個Java Project項目,名字為spring-0。
然後在src目錄下新建一個lib文件夾,把以下jar包賦值進去,然後選擇把lib文件夾下的jar包都添加到工程build path中去,新建HelloWorld.java文件,存放於com.hello包中,最後工程目錄結構如下所示:
HelloWorld.java內容如下:
1 package com.hello; 2 3 public class HelloWorld { 4 private String name; 5 6 public HelloWorld() { 7 System.out.println("HelloWorld constructor..."); 8 } 9 10 public HelloWorld(String name) { 11 System.out.println("HelloWorld constructor with paramter..."); 12 this.name = name; 13 } 14 15 public void setName(String name) { 16 System.out.println("HelloWorld setName..."); 17 this.name = name; 18 } 19 20 public void hello() { 21 System.out.println("hello: " + this.name); 22 } 23 }
然後在com.hello包中再新建一個Main.java來調用HelloWorld類,Main.java內容如下:
1 package com.hello; 2 3 public class Main { 4 public static void main(String[] args) { 5 // 1.獲取HelloWorld實例 6 HelloWorld helloWorld = new HelloWorld(); 7 // 2.調用實例中方法 8 helloWorld.hello(); 9 } 10 }
當然,到這裡我們並沒有與spring產生任何交互,只是普通的調用類方法而已,下面開始進入正題。首先,點擊src文件夾,鼠標右鍵new -> File,然後命名為applicationContext.xml,該配置文件配置所調用類之間的依賴關系。
applicationContext.xml文件內容如下所示:
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 4 5 <!-- 配置bean,屬性配置方式 --> 6 <bean id="helloWorld" class="com.hello.HelloWorld"> 7 <property name="name" value="spring"></property> 8 </bean> 9 10 <!-- 通過構造方法配置bean屬性 --> 11 <bean id="helloWorld2" class="com.hello.HelloWorld"> 12 <constructor-arg value="spring2" index="0"></constructor-arg> 13 </bean> 14 </beans>
最後修改Main.java文件,內容如下所示:
1 package com.hello; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class Main { 7 public static void main(String[] args) { 8 // 1. 創建spring的IOC容器對象 9 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 10 11 // 2. 從IOC容器中獲取Bean實例 12 HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld"); 13 // 3. 調用實例中方法 14 helloWorld.hello(); 15 16 HelloWorld helloWorld2 = (HelloWorld) ctx.getBean("helloWorld2"); 17 helloWorld2.hello(); 18 } 19 }
最後輸出結果如下:
可以看到,我們在Main.java中確實調用了我們在applicationContext.xml中配置的內容,注意:在Spring IOC容器讀取Bean配置創建Bean實例之前,必須對它進行初始化,只有在容器實例化後,才可以從IoC容器裡獲取Bean實例並使用它。
Spring中如何配置Hibernate事務 http://www.linuxidc.com/Linux/2013-12/93681.htm
Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm
基於 Spring 設計並實現 RESTful Web Services http://www.linuxidc.com/Linux/2013-10/91974.htm
Spring-3.2.4 + Quartz-2.2.0集成實例 http://www.linuxidc.com/Linux/2013-10/91524.htm
使用 Spring 進行單元測試 http://www.linuxidc.com/Linux/2013-09/89913.htm
運用Spring注解實現Netty服務器端UDP應用程序 http://www.linuxidc.com/Linux/2013-09/89780.htm
Spring 3.x 企業應用開發實戰 PDF完整高清掃描版+源代碼 http://www.linuxidc.com/Linux/2013-10/91357.htm
Spring 的詳細介紹:請點這裡
Spring 的下載地址:請點這裡