淺談Spring

Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在覈心容器之上,核心容器定義了創建、配置和管理 bean 的方式,組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:

     Spring Core:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC)模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。

     Spring Context:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。

     Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。

     Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。

     Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。

     Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,爲基於 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。

     Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 框架的功能可以用在任何 J2EE 服務器中,大多數功能也適用於不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環境 (Web 或 EJB)、獨立應用程序、測試環境之間重用。

 

源碼淺談

spring 是一個對象容器

它以監聽器(listener)的形式出現在項目中

項目啓動的時候默認加載applicationContext.xml

ContextLoaderListener 是他的核心入口

ContextLoaderListener的作用就是啓動Web容器時,自動裝配ApplicationContext的配置信息。

ContextLoaderListener實現了tomcat 提供的監聽器api接口ServlertContextListener,重寫 ContextInitialized 方法實現啓動時加載

通過繼承spring 的ContextLoader,調用initWebApplicationContext 方法進行 WebApplicationContext 的初始化

進入initWebApplicationContext 方法後,首先先會判斷Context 對象是否爲空,爲空創建一個WebAppcationContext

然後通過調用configureAndRefreshWebApplicationContext 方法通過web.xml取得相關的初始化參數,對WebApplicationContext進行初始化,

初始化的過程中 通過調用XmlBeanDefinitionReader 中 loadBeanDefinitions

方法 進行xml文件的讀取與加載 (如果這一步出錯,報錯:Could not open ServletContext resource [/WEB-INF/applicationContext.xml])

通過refresh 方法的實現類AbstractApplicationContext對bean容器進行初始化

在我看源代碼的時候,發現他有一個叫做XmlBeanDefinitionReader去讀取並解析xml      

生成對象的時候是通過 spring的一個叫做 ClassUtils 工具類生成 class對象的.

這就是爲什麼spring 對象啓動後就生成好的原理。

真正放spring 對象的容器叫做 AbstractBeanFactory ,是 BeanFactory 的實現類

spring 通過  AbstractBeanFactory.doGetBean方法獲取配置文件中的bean

通過 ClassUtils.forName 生成 bean對象(

在bean之間調用的時候,由AbstractAutowireCapableBeanFactory 進行依賴注入(報錯:Bean property '屬性' is not writable )

 

spring 特性 :

IOC  (Inversion Of Control ):<context:component-scan base-package="com.service"/> 掃包。

            項目啓動時,所有的類都登記在spring容器中,當你需要時去spring中調用。

            所有類的創建、銷燬都有spring控制,所以控制對象生存的生命週期是spring。

 

DI  (Dependency Injection):DI的基本概念是容器,這個容器用於註冊接口和對應的實現,A從容器中根據接口來獲取實現,具體的實現是那個類不需要了解,用完怎麼釋放也不需要管。

 

AOP  (Aspect Oriented Programming):具體使用在事務DataSourceTransactionManager

                                                                    使OOP(封裝,繼承,多態)更加立體。

AOP基本上是通過代理機制來實現的,代理模式有兩種

靜態代理:   針對每個具體類分別編寫代理類;  針對一個接口編寫一個代理類;  

動態代理:  JDK要求真實角色必須實現某個接口否則無法爲其創建代理對象 ,cglib 面向接口或父類的代理模式實現.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章