本章內容:java
在基於Spring的應用中,你的應用對象存在於Spring容器(container)中.Spring負責建立對象,裝配它,並管理它們的整個生命週期,從生存到死亡(new 到finalize())。git
首先重要的是瞭解容納對象的容器。理解容器將有助於理解對象是如何建立的。github
容器是Spring框架的核心。Spring容器使用DI管理構成應用的組件,它會建立相互協做的組件愛你之間的聯繫。這些對象更簡單幹淨、更容易理解,更易於重用而且易於進行單元測試。web
Spring容器並不僅是隻有一個,Spring自帶了多個容器實現,能夠概括爲兩種不一樣的類型:spring
org.springframework.beans.factory.BeanFactory
接口定義的。是最簡單的容器。org.springframework.context.applicationContext
接口定義的。基於BeanFactory構建,並提供應用框架級別的服務,例如:從屬性文件解析文本信息以及發佈應用事件給感興趣的事件監聽器。應用上下文比Bean工廠更受歡迎。bean工廠對於大多數應用來講過低級了。數據庫
Spring自帶了多種應用上下文:編程
AnonotationConfigApplicationContext
:從一個或多個基於Java的配置文件類中加載Spring應用上下文AnnotationConfigWebApplicationContext
:從一個或多個基於Java配置類加載SpringWeb應用上下文ClassPathXmlApplicationContext
:從類路徑下的一個或多個XML配置文件中加載上下文定義,把應用上下文的定義文件做爲類資源FileSystemXmlapplicationContext
:從文件系統下的一個或多個XMl配置文件中加載上下文定義XmlWebapplicationContext
:從web應用下的一個或多個XML配置文件中加載上下文定義不管是從文件系統中裝配應用上下文仍是從類路徑下裝配應用上下文,將bean加載到bean工廠的過程都是類似的。緩存
加載一個FileSystemXmlApplicationContext
: 在文件系統的路徑下查找knight.xml安全
ApplicationContext context = new FileSystemXmlApplicationContext("c:/knight.xml");
也可使用ClassPathXmlApplicationContext
: 全部的類路徑下查找knight.xmlmybatis
ApplicationContext context = new ClassPathXmlApplicationCOntext("knight.xml");
也能夠從Java配置中加載應用上下文,那麼可使用AnnotationConfigApplicationContext
ApplicationContext context = new AnonotationConfigApplicationContext( com.guo.knights.config.KnightConfig.class);
應用上下文準備就緒以後,咱們就能夠調用上下文的getBean()方法從Spring容器中獲取bean。
在傳統的Java應用中,bean的生命週期很簡單。使用Java關鍵字new進行bean實例化,而後bean就可使用了。
一旦bean再也不使用,則由JCM自動進行垃圾回收。
相比之下,Spring容器中的bean聲明週期就顯得複雜多了。正確理解Spring bean的生命週期很是重要,由於你或許要利用Spring提供的擴展點來自定義bean的建立過程。
在bean工廠執行力若干啓動步驟;
Srping框架經過關注於經過DI、AOP和消除模板樣式代碼來簡化企業級Java開發。即便這是Spring所能做的所有事情,那麼Spring也值得一用,Spring實際上的功能超乎你的想象
這些模塊依據其所屬的功能劃分爲6類不一樣的功能,總而言之,這些模塊爲開發企業及應用提供了所需的一切 。可是你也沒必要將應用創建在整個Spring框架上,你能夠自由的選擇合適自身應用需求的Spring模塊:當Spring不能知足需求時,徹底能夠考慮其餘選擇,事實上,Spring甚至提供了與其餘的第三方框架和類庫的集成點,這樣你就不須要本身編寫代碼了。
Spring核心容器
容器是Spring最核心的部分,它管理者Spring應用中bean的建立、配置、管理。在該模塊中,包括了Spring bean工廠,它爲Spring提供了DI的功能,甚至bean工廠,咱們還會發現有多種Spring應用上下文的實現,每一種都提供了配置Spring的不一樣方式。
全部的Spring模塊都構建於核心容器之上。當你配置應用時,其實你隱式的使用率這些類。
SpringAOP模塊
在AOP模塊中,Spring對面向切面編程提供了豐富的支持。這個模塊是Spring應用系統中開發切面的基礎。與DI同樣,AOP能夠幫助應用對象解耦,藉助於AOP,能夠將遍及系統的應用的關注點(例如:事務,安全,日誌)從它們所應用的對象中解耦出來。
數據訪問與集成
使用JDBC編寫代碼一般會致使大量的樣式代碼,Spring的JDBC和DAO模塊抽象類這些樣板代碼,是咱們的數據庫代碼變得簡單明瞭。還能夠避免由於關閉數據庫資源失敗而引起的問題。該模塊在多種數據庫服務的錯誤信息之上構建了一個語義豐富的異常層,之後咱們不再須要解釋那些隱晦專有的SQL信息了。
Spring提供了ORM模塊,Spring的ORM模塊創建在DAO的支持之上,併爲多個ORM框架提供了一種構建DAO的簡便方式 。Spring沒有嘗試去建立本身的ORM解決方,而是對許多流行的ORM框架進行了集成。包括Hibernater、Java Persisternce API、Java Data Object 和mybatis。Spring的事務管理支持全部的ORM框架以及JDBC。
Web與遠程調用
MVC(Model-View-Controller)模塊是一種廣泛被接受的構建Web應用的方法,它能夠幫助用戶將界面邏輯與應用邏輯分離,Java歷來不缺乏MVC框架,Apache的struts二、JSF、WebWorks都是可選的最流行的MVC框架。Spring遠程調用功能集成了RMI(Remote mehtod Invocation)、Hessian、CXF。Spring還提供了暴露和使用RESTAPI的良好支持。
Instrumentation
Spring的Instrumentation模塊提供了爲JVM
添加代理(agent)的功能.具體來說,它爲Tomcat提供了一個織入代理,可以爲Tomcat傳遞類文件,就像這些文件時被類加載器加載的同樣。
Testing
經過該模塊,你會發現Spring爲JNDI、Servlet和Portlet編寫單元測試提供了一系列的mock對象事項,對於繼承測試,該模塊爲加載Spring應用上下文中的bean集合以及與Spirng上下文中的bean進行交互提供了支持。
若是僅僅停留在和性的Spring框架層面,咱們將錯過Spring Portlio所提供的鉅額財富。整個Spirng Portlio包括多個構建與核心Spring框架之上的框架和類庫。歸納的來說,整個Spring Portlio幾乎爲每個領域的Java開發都提供了Spring編程模型
Spring 3.1帶來了多項有用的新特性 和加強,其中有不少都是關於如何簡化個改善配置的。除此以外,Spring3.1還提供了聲明式緩存的支持以及衆多針對SpringMVC的的功能加強。
Spring 3.2主要關注Spring MVC的一個發佈版本。
Spring MVC 3.2帶來以下的功能提高
Spring致力於簡化企業級開發Java開發、促進代碼的鬆耦合。成功的關鍵在於依賴注入和AOP。
DI是組裝應用對象的一種方式,藉助於這種方式對象無需知道依賴來自於何處或者依賴的具體實現方式。不一樣於本身獲取依賴對象,對象會在運行期賦予它們所依賴的對象。依賴對象一般會經過接口瞭解所注入的對象,這樣的話就能確保低耦合。
除了DI,還簡單介紹了Spring對AOP的支持,AOP能夠幫助應用將散落在各處的邏輯聚集於一處——切面。當Spring裝配bean的時候,這些切面可以運行期編織起來,這樣就能呢個很是有效的賦予bean新功能。
依賴注入和AOP是Spring框架最核心的部分,只有理解了如何應用Spring是最關鍵的功能。你纔有能力使用Spring框架的其餘功能。