Spring詳解(概述、元件詳解、載入流程)
1.Spring是什麼?
Spring 是一個開源框架,是為了解決企業應用程式開發複雜性而建立的。框架的主要優勢之一就是其分層架構,分層架構允許您 選擇使用哪一個元件,同時為 J2EE 應用程式開發提供整合的框架。
2.Spring特點?
(1)IOC(控制反轉)或DI(依賴注入):明確定義元件的介面,獨立開發各個元件,然後根據元件的依賴關係組裝執行;即將建立及管理物件的權利交給Spring容器。Spring是一個輕型容器(light-weight Container),其核心是Bean工廠(Bean Factory),用以構造我們所需要的M(Model)。能夠讓相互協作的軟體元件保持鬆散耦合。降低了業務物件替換的複雜性,提高了元件之間的解耦
(2)AOP(面向切面程式設計):通過預編譯方式和執行期動態代理實現在不修改原始碼的情況下給程式動態統一新增功能的一種技術。即系統級的服務從程式碼中解耦出來。例如:將日誌記錄,效能統計,安全控制,事務處理,異常處理等程式碼從業務邏輯程式碼中劃分出來。允許你把遍佈應用各處的功能分離出來形成可重用元件。
3.Spring框架好處?
(1)控制反轉:Spring通過控制反轉實現了鬆散耦合,物件們給出它們的依賴,而不是建立或查詢依賴的物件們。
(2)面向切面的程式設計(AOP):Spring支援面向切面的程式設計,並且把應用業務邏輯和系統服務分開。
(3)MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
(4)低侵入式設計,程式碼汙染極低,獨立於各種應用伺服器,基於Spring框架的應用,可以真正實現Write Once,Run Anywhere的承諾。
(5)整合能力強:整合多種優秀的開源框架。(Hibernate、Struts、Hessian等)。
(6)異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO丟擲的)轉化為一致的unchecked 異常。
(7)容器:Spring 包含並管理應用中物件的生命週期和配置。
(8)輕量:Spring 是輕量的,基本的版本大約2MB。
4.Spring基本組成模組?
(1)CoreContain模組:Core、bean、context、Expression Language。
(2) Data Access/integration(整合)模組:JDBC、ORM、OXM、JMS、Transaction.
(3)Web模組:WEB、Web-Servle、Web-Struts、Web-Portlet。
(4)AOP、Aspects、Instrumentation、Test.
//載入應用上下文
ClassPathXmlApplicationContext context=newClassPathXmlApplicationContext("ClassPath:spring.xml");
//獲取bean
User user = context.getBean("user");
5.Spring核心元件詳解
Spring核心元件只有Core、Context、Beans三個。core包側重於幫助類,操作工具,beans包更側重於bean例項的描述。context更側重全域性控制,功能衍生。
5.1Bean元件
Bean元件主要解決:Bean 的定義、Bean 的建立以及對 Bean 的解析。
開發者關心Bean建立,其他由Spring內部幫你完成。
(1)Bean 的建立時典型的工廠模式,他的頂級介面是 BeanFactory,下圖是這個工廠的繼承層次關係:
Bean 工廠的繼承關係
BeanFactory 有三個子類:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。但終的預設實現類是 DefaultListableBeanFactory。實現多介面是為了區分在 Spring 內部操作物件傳遞和轉化時,對物件的資料訪問所做的限制。例如 ListableBeanFactory 介面表示這些 Bean 是可列表的,HierarchicalBeanFactory 表示的是這些 Bean 是有繼承關係的,也就是每個 Bean 有可能有父 Bean。AutowireCapableBeanFactory 介面定義 Bean 的自動裝配規則。這四個介面共同定義了 Bean 的集合、Bean 之間的關係、以及 Bean 行為。
(2)Bean 的定義主要有 BeanDefinition 描述,如下圖說明了這些類的層次關係:
Bean 定義的類層次關係圖
Bean 的定義就是完整的描述了在 Spring 的配置檔案中你定義的 <bean/> 節點中所有的資訊,包括各種子節點。當 Spring 成功解析你定義的一個 <bean/> 節點後,在 Spring 的內部他就被轉化成 BeanDefinition 物件。以後所有的操作都是對這個物件完成的。
(3)bean 的解析過程非常複雜,功能被分的很細,因為這裡需要被擴充套件的地方很多,必須保證有足夠的靈活性,以應對可能的變化。Bean 的解析主要就是對 Spring 配置檔案的解析。這個解析過程主要通過下圖中的類完成:
Bean解析類
5.2Content元件
Context 在 Spring 的 org.springframework.context 包下,給 Spring 提供一個執行時的環境,用以儲存各個物件的狀態。
ApplicationContext 是 Context 的頂級父類,他除了能標識一個應用環境的基本資訊外,他還繼承了五個介面,這五個介面主要是擴充套件了 Context 的功能。下面是 Context 的類結構圖:
從上圖中可以看出 ApplicationContext 繼承了 BeanFactory,這也說明了 Spring 容器中執行的主體物件是 Bean,另外 ApplicationContext 繼承了 ResourceLoader 介面,使得 ApplicationContext 可以訪問到任何外部資源,這將在 Core 中詳細說明。
ApplicationContext 的子類主要包含兩個方面:
1.ConfigurableApplicationContext 表示該 Context 是可修改的,也就是在構建 Context 中使用者可以動態新增或修改已有的配置資訊,它下面又有多個子類,其中最經常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext 類。
2.WebApplicationContext 顧名思義,就是為 web 準備的 Context 他可以直接訪問到 ServletContext,通常情況下,這個介面使用的少。
再往下分就是按照構建 Context 的檔案型別,接著就是訪問 Context 的方式。這樣一級一級構成了完整的 Context 等級層次。
總結:
總體來說 ApplicationContext 必須要完成以下幾件事:
(1)標識一個應用環境。
(2)利用 BeanFactory 建立 Bean 物件。
(3)儲存物件關係表。
(4)能夠捕獲各種事件。
Context 作為 Spring 的 Ioc 容器,基本上整合了 Spring 的大部分功能,或者說是大部分功能的基礎。
5.3Core元件
Core 元件作為 Spring 的核心元件,他其中包含了很多的關鍵類,其中一個重要組成部分就是定義了資源的訪問方式。這種把所有資源都抽象成一個介面的方式很值得在以後的設計中拿來學習。
從下圖可以看出 Resource 介面封裝了各種可能的資源型別,也就是對使用者來說遮蔽了檔案型別的不同。對資源的提供者來說,如何把資源包裝起來交給其他人用這也是一個問題,我們看到:
Resource 相關的類結構圖
從上圖可以看出 Resource 介面封裝了各種可能的資源型別,也就是對使用者來說遮蔽了檔案型別的不同。對資源的提供者來說,如何把資源包裝起來交給其他人用這也是一個問題,我們看到:
遮蔽資源提供者: Resource 介面繼承了 InputStreamSource 介面,這個介面中有個 getInputStream 方法,返回的是 InputStream 類。這樣所有的資源都被可以通過 InputStream 這個類來獲取,所以也遮蔽了資源的提供者。
資源載入:ResourceLoader 介面完成載入,他遮蔽了所有的資源載入者的差異,只需要實現這個介面就可以載入所有的資源,他的預設實現是 DefaultResourceLoader。
Resource與Context如何建立聯絡:
從上圖可以看出,Context 是把資源的載入、解析和描述工作委託給了 ResourcePatternResolver 類來完成,他相當於一個接頭人,他把資源的載入、解析和資源的定義整合在一起便於其他元件使用。Core 元件中還有很多類似的方式。
6.Spring初始化邏輯(流程)?
附件:
1. 應用上下文載入類:
(1)應用上下文(Application Context)負責裝載bean的定義,並把它們組裝起來,即裝載配置檔案。Spring應用上下文全權負責物件的組裝。spring自帶多種應用上下文的實現,它們之間的區別僅僅在於如何載入配置。
若Spring採用的是xml配置,則選擇ClassPathXMLApplicationContext作為應用上下文比較合適。而對於基於java的配置,Spring提供了 AnnotationConfigApplicationContext.載入應用上下文:
(2)Spring自帶了多種型別的應用上下文。
a、AnnotationConfigApplicationContext:從一個或多個基於Java配置類中載入Spring應用上下文。
b、AnnotationConfigWebApplicationContext:從一個或多個基於java的配置類中載入Spring Web應用上下文。
c、ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置檔案中載入上下文定義,把應用上下文定義檔案作為類資源。
d、FileSystemXMLApplicationContext:從檔案系統下的一個或多個xml配置檔案中載入上下文定義。
e、xmlWebApplicationContext:從Web應用的一個或多個xml配置檔案中載入上下文定義。
//載入應用上下文的幾種方式示例 //基於xml的配置 ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(“classpath:spring.xml”); //基於java的配置 AnnotaitionConfigApplicationContext context=new AnnotationConfigApplicationContext(“com.star.config.KnightConfig.class”);
應用上下文準備就緒之後,我們就可以呼叫上下文的getBean()方法從Spring容器中獲取bean。
2.BeanFactory 工廠建立
(1)這個方法就是構建整個 Ioc 容器過程的完整的程式碼,瞭解了裡面的每一行程式碼基本上就瞭解大部分 Spring 的原理和功能了。這段程式碼主要包含這樣幾個步驟:(1)構建 BeanFactory,以便於產生所需的“演員”。(2)註冊可能感興趣的事件。 (3)建立 Bean 例項物件。(4)觸發被監聽的事件。
(2)refresh 也就是重新整理配置,前面介紹了 Context 有可更新的子類,這裡正是實現這個功能,當 BeanFactory 已存在是就更新,如果沒有就新建立。下面是更新 BeanFactory 的方法程式碼:
參考部落格:
https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle。