Spring框架
Spring當前框架有20個jar包赴魁,大致可以分為6大模塊:
- Core Container
- AOP and Instrumentation
- Messaging
- Data Access/Integration
- Web
- Test
Spring框架提供了非常豐富的功能爪幻,因此整個架構也很龐大。
在我們實際的應用開發(fā)中,并不一定要使用所有的功能搂妻,而是可以根據(jù)需要選擇合適的Spring模塊。
核心容器 (Core Container)
IoC容器是Spring框架的核心辕棚。spring容器使用依賴注入管理構成應用的組件欲主,它會創(chuàng)建相互協(xié)作的組件之間的關聯(lián)。毫無疑問逝嚎,這些對象更簡單干凈扁瓢,更容易理解,也更容易重用和測試补君。
Spring自帶了幾種容器的實現(xiàn)涤妒,可歸納為兩種類型:
BeanFactory
由org.springframework.beans.factory.BeanFactory接口定義。
它是最簡單的容器赚哗,提供基本的DI支持。
ApplicationContext
由org.springframework.context.ApplicationContext接口定義硅堆。
它是基于BeanFactory 之上構建屿储,并提供面向應用的服務,例如從屬性文件解析文本信息的能力渐逃,以及發(fā)布應用事件給感興趣的事件監(jiān)聽者的能力够掠。
注:Bean工廠對于大多數(shù)應用來說往往太低級了,所以應用上下文使用更廣泛茄菊。推薦在開發(fā)中使用應用上下文容器疯潭。
Spring自帶了多種應用上下文,最可能遇到的有以下幾種:
ClassPathXmlApplicationContext
:從類路徑下的XML配置文件中加載上下文定義面殖,把應用上下文定義文件當做類資源竖哩。
FileSystemXmlApplicationContext
:讀取文件系統(tǒng)下的XML配置文件并加載上下文定義。
XmlWebApplicationContext
:讀取Web應用下的XML配置文件并裝載上下文定義脊僚。
范例
ApplicationContext context = new FileSystemXmlApplicationContext("D:\Temp\build.xml");
ApplicationContext context2 = new ClassPathXmlApplicationContext("build.xml");
可以看到相叁,加載 FileSystemXmlApplicationContext
和 ClassPathXmlApplicationContext
十分相似。
差異在于:前者在指定文件系統(tǒng)路徑下查找build.xml文件辽幌;而后在所有類路徑(包含JAR文件)下查找build.xml文件增淹。
通過引用應用上下文,可以很方便的調(diào)用 getBean() 方法從 Spring 容器中獲取 Bean乌企。
相關jar包
spring-core
, spring-beans
, 提供框架的基礎部分虑润,包括IoC和依賴注入特性。
spring-context
, 在spring-core
, spring-beans
基礎上構建加酵。它提供一種框架式的訪問對象的方法拳喻。
它也支持類似Java EE特性哭当,例如:EJB,JMX和基本remoting舞蔽。ApplicationContext接口是它的聚焦點荣病。
springcontext-support
, 集成第三方庫到Spring application context。
spring-expression
渗柿,提供一種強有力的表達語言在運行時來查詢和操縱一個對象圖个盆。
AOP 和 Instrumentation
相關jar包
spring-aop
,提供了對面向切面編程的豐富支持朵栖。
spring-aspects
颊亮,提供了對AspectJ的集成。
spring-instrument
陨溅,提供了對類instrumentation的支持和類加載器终惑。
spring-instrument-tomcat
,包含了Spring對Tomcat的instrumentation代理门扇。
Messaging
相關jar包
spring-messaging
雹有,包含spring的消息處理功能,如Message臼寄,MessageChannel霸奕,MessageHandler。
數(shù)據(jù)訪問與集成 (Data Access / Integaration)
Data Access/Integration層包含了JDBC / ORM / OXM / JMS和Transaction模塊吉拳。
相關jar包
spring-jdbc
质帅,提供了一個JDBC抽象層。
spring-tx
留攒,支持編程和聲明式事務管理類煤惩。
spring-orm
,提供了流行的對象關系型映射API集炼邀,如JPA魄揉,JDO,Hibernate汤善。
spring-oxm
什猖,提供了一個抽象層以支持對象/XML 映射的實現(xiàn),如JAXB红淡,Castor不狮,XMLBeans,JiBX 和 XStream.
spring-jms
在旱,包含了生產(chǎn)和消費消息的功能摇零。
Web
相關jar包
spring-web
,提供了基本的面向web的功能桶蝎,如多文件上傳驻仅、使用Servlet監(jiān)聽器的Ioc容器的初始化谅畅。一個面向web的應用層上下文。
spring-webmvc
噪服,包括MVC和REST web服務實現(xiàn)毡泻。
spring-webmvc-portlet
,提供在Protlet環(huán)境的MVC實現(xiàn)和spring-webmvc
功能的鏡像粘优。
測試 (Test)
相關jar包
spring-test
仇味,以Junit和TestNG來支持spring組件的單元測試和集成測試。
SpringMVC工作流程描述
Spring MVC的工作流程可以用一幅圖來說明:
(1)向服務器發(fā)送HTTP請求雹顺,請求被前端控制器
DispatcherServlet
捕獲丹墨。(2)
DispatcherServlet
根據(jù) <servlet-name>-servlet.xml 中的配置對請求的URL進行解析,得到請求資源標識符(URI)嬉愧。然后根據(jù)該URI贩挣,調(diào)用
HandlerMapping
獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最后以HandlerExecutionChain
對象的形式返回没酣。(3)
DispatcherServlet
根據(jù)獲得的Handler
王财,選擇一個合適的 HandlerAdapter
。(附注:如果成功獲得HandlerAdapter
后裕便,此時將開始執(zhí)行攔截器的preHandler(...)方法)搪搏。(4)提取
Request
中的模型數(shù)據(jù),填充Handler
入?yún)⑸两穑_始執(zhí)行Handler
(Controller
)。 在填充Handler
的入?yún)⑦^程中论颅,根據(jù)你的配置哎垦,Spring將幫你做一些額外的工作:HttpMessageConveter: 將請求消息(如Json、xml等數(shù)據(jù))轉換成一個對象恃疯,將對象轉換為指定的響應信息漏设。
數(shù)據(jù)轉換:對請求消息進行數(shù)據(jù)轉換。如
String
轉換成Integer
今妄、Double
等郑口。數(shù)據(jù)根式化:對請求消息進行數(shù)據(jù)格式化。 如將字符串轉換成格式化數(shù)字或格式化日期等盾鳞。
數(shù)據(jù)驗證: 驗證數(shù)據(jù)的有效性(長度犬性、格式等),驗證結果存儲到
BindingResult
或Error
中腾仅。(5)Handler(Controller)執(zhí)行完成后乒裆,向
DispatcherServlet
返回一個 ModelAndView
對象;(6)根據(jù)返回的
ModelAndView
推励,選擇一個適合的 ViewResolver
(必須是已經(jīng)注冊到Spring容器中的ViewResolver
)返回給DispatcherServlet
鹤耍。(7)
ViewResolver
結合Model
和View
肉迫,來渲染視圖。(8)視圖負責將渲染結果返回給客戶端稿黄。