目錄
1.Spring的簡介
Spring是一個輕量級架構【包括8大模塊】
Spring 是一款用於簡化企業級Java應用開發的分層開源框架,它有着請打的額擴展、融合能力,善於將各種單層框架完美的柔和在一起,並建立一個完整體系,同一、高校地構造可提供企業級服務的應用系統。
Spring是一個分層非常清晰並且依賴關係、職責定位非常明確的輕量級架構,主要分爲8大模塊:
數據處理塊、Web塊、AOP模塊、Aspects模塊、Instrumentation模塊、Messaging模塊、CoreContainer模塊和Test模塊,Spring依靠這些基本模塊,實現了一個令人愉悅的融合了現有的解決方案的零侵入的輕量級框架。
2.Spring框架的組成圖
3.模塊詳解
3.1Web模塊
【該模塊由Web、WebSocket、Servlet和Portlet等模塊組成】
a.Web模塊提供了面向Web開發的集成功能;
b.WebSocket模塊提供了面向WebSocket開發的集成功能;
c.Servlet模塊(也被稱爲Spring MVC模塊)包含Spring的Model-View-Controller(模型-視圖-控制器)和REST Web Services實現的Web應用程序。Spring MVC框架是 Domain Model代碼和Web Form代碼實現了完全分離,並且集成了Spring Framework的所欲功能;
d.Portlet模塊:是基於Web和 Servlet模塊的MVC實現。Portlet和Servlet的最大區別就是對請求的處理分爲Action階段和Render階段。在處理一次HTTP請求時,在Action階段處理業務邏輯響應並且當前邏輯處理會被執行多次,這樣就保證了業務系統在處理同一個業務邏輯時能夠進行定製性響應頁面模版渲染。
3.2數據處理模塊(Data Access)
【該模塊由JDBC、Transactions、ORM、OXM、和JMS等模塊組成】
a.JDBC模塊提供了不需要編寫冗長的JDBC代碼和解析數據庫廠商特有的錯誤代碼的JDBC-抽象層;
b.Transactions模塊支持編程和聲明式事務管理;
c.ORM模塊提供了流行的Object-Relational Mapping(對象-關係映射)API集成層,包含JPA、JDO和Hibernate等ORM框架,Spring對ORM的支持和封裝主要體現在三方面:一致的異常處理體系結構,對第三方ORM框架拋出的專有異常進行了包裝;一致的DAO抽象的支持,爲每個框架都提供了模板類來簡化和封裝常用操作,例如:JDBCSupport、HibernateTemplate等;Spring的事務管理機制,爲所有數據訪問都提供了一致的事務管理;
d.OXM模塊提供抽象層,用於支持Object/XML mapping(對象/XML映射)的實現,例如JAXB、Castor、XMLBeans、JIBX和XStream等。
e.JMS模塊包含生產和消費信息的功能
3.3AOP模塊
該模塊是Spring的代理模塊,也是Spring的核心模塊,它巧妙地利用了JVM動態代理和CGLIB動態代理面向過程編程,來實現業務領侵入、低耦合的效果。爲了確保Spring與其他AOP框架的互用性,Spring AOP模塊支持基於AOP聯盟定義的API,也就是Aspects模塊,與SpringIOC模塊相輔相成。其中,我們熟知且常用的事務管理就是利用Spring AOP模塊實現的。 Spring AOP模塊及Spring樑海的架構設計及擴展性,使得Spring可以融合基本上所有的模塊及其他框架,成爲真正的集大成者。
3.4Aspects 模塊
該模塊提供了與 AspectJ(一個功能請打併且成熟的面向切面編程的框架)集成,它擴展了java 語言,定義了AOP語法,持有一個專門的編譯器來生成遵守Java字節編碼規範的Class文件,使用字節碼生成技術來實現代理。
3.5Instrumentation模塊
該模塊是S平日你個對其它容器的繼承及對類加載器的擴展實現,其子模塊Spring-instrument-tomcat實現了Tomcat Instrumentation代理功能。
3.6Messaging模塊
該模塊是從S平日你個集成項目中抽象出來的,類似於基於註解的Spring MVC編程模塊,包含一系列消息與方法的映射註解
3.7Core Container模塊
該模塊是Springde 根基,由Beans、Core、Context、SpEL四個子模塊組成,這四個子模塊如下所述。
a.Beans 模塊和Core模塊提供框架的基礎部分,包含IoC(控制反轉)和DI(依賴注入)功能,使用BeanFactory基本概念來實現容器對Bean的管理,是所有Spring應用的核心。Spring本身的運行都是由這種Bean的核心模型進行加載和執行的,是Spring其他模塊的核心支撐,是運行的根本保證。
b.Context(包含Spring-Context和Spring-Context-Support兩個子模塊)模塊建立在Core模塊和Beans模塊的焦點。Spring-Context-Support模塊支持集成第三方常用庫到Spring應用上下文中;
c.SpEL模塊提供了強大的表達式語言來查詢和操作運行時的對象;
3.8Test模塊
該模塊支持通過組合JUnit或TestNG來進行單元測試和集成測試,並且提供了Mock Object(模仿對象)方式進行測試。在該模塊中定義了註釋,例如@ContextConfiguration、@WebAPPConfiguration、@ContextHierarchy、@ActiveProfiles,可以被用作元註釋來創建自定義註解並避免整個測試套件的重複構造。
4.Spring的優點
(1)降低了J2EE的使用難度,並且方便集成各種框架;
(2)推薦大量使用向對象的設計思想,是以Java源碼的經典框架;
(3)面向接口編程,而不是面向類編程,不斷地利用Java的多態特性及良好的面向對象設計思想,來降低程序的複雜度及耦合度;
(4)提供了測試框架,並且支持繼承其他測試框架,是測試更容易,對測試程序的編寫也更簡單、高效;
5.Spring核心思想
基本定義:
(1)IoC:控制反轉:控制權從應用程序轉移到框架;
(2)IoC容器:實現IoC思想的容器;
(3)DI(依賴注入):依賴注入用一個單獨的對象(裝配器)來裝配對象之間的依賴關係
6.Spring 框架的特點
(1)輕量級;
(2)控制反轉:實現鬆耦合---->依賴被注入到對象,而不是創建或尋找依賴對象;
(3)面向切面編程;
(4)容器:Spring包含並管理應用程序對象的配置及生命週期;
(5)MVC框架;
(6)事務管理:Spring對下至本地業務上至全局業務提供了統一的事務管理接口;
(7)異常處理:Spring提供一個方便的API將特定技術的異常(由JDBC,Hibernate,或JDO拋出)轉化爲一致的Unchecked異常
7.Spring IoC容器構建(構建方式有3種)
(1)基於XML配置的方式【可以開啓註解配置,通過註解配置Bean和裝配工作】
(2)基於Goovy腳本的方式(一般不用)
(3)基於Java Config的配置註解方式【主要通過Configuration和Bean註解】
8.Bean的實例化
(1)靜態工廠方法實例化;
(2)實例工廠方法實例化;
(3)構造方法實例化;
9.Bean的依賴裝配
(1)構造方法參數裝配(4種方式)
在Spring中,可以使用“通過構造方法自動裝配”,實際傷害是按照構造函數的參數類型以及構造方法的參數順序自動裝配。即就是如果一個bean的數據類型與其他bean的構造器參數的數據類型是相同的,那麼將自動裝配,如果裝配過程中構造方法的參數具有歧義的時候,就需要我們指定類型,位置或中參數名的方式來告知Spring如何裝配。
a)Bean 的引用;
b)根據參數類型;
c)根據參數位置;
d)根據參數名稱【使用場景比較少,具有特殊限制,需要開啓編譯時參數名稱保留,JDK1.8之前採用@ConstructorProperties註解,JDK1.8之後可以在編譯的是偶添加-Parameters來確保編譯之後保留參數名】;
(2)Setter方法裝配
容器在抵用無參數構造方法或者工廠方法實例化Bean之後,調用Setter方法完成屬性的裝配
10.依賴和配置詳解【3種方式】
(1)直接賦值;
針對基本類型和String類型,可以平四肢properties元素的value屬性用來指定屬性或者構造方法參數賦值;
(2)idref和ref元素;
在Spring中,idref和ref屬性都可以用在constructor-arg元素和property元素完成裝配;
idref和ref的區別:
a.idref裝配的目標bean的id而不是目標bean的實例,同時使用idref容器在部署的時候還會驗證這個名稱的bean是否真實存在。其實idref就跟value一樣,知識將某個字符串裝配到屬性或者構造函數中,指不過裝配的是某個Bean裝配的id屬性值;
b.ref則是將目標bean定義的實例裝配到屬性或構造函數中;
(3)內部bean【一個<bean/>元素定義在<property/>和<constructor-arg>元素中】
7.其它
Colleollection
使用<list/>,<set/>,<map/>,<props>元素可以設置Java集合類型(比如:List,Set,Map,Properties)的屬性和參數,在使用集合元素時如Map的key和value,集合的value可以使用【bean/ref/idref/list/set/map/props/value/null】
延遲初始化:Spring容器啓動時默認將所有的Bean都初始化完成,設置延遲初始化時告訴容器在第一次使用bean時完成初作,而不是啓動時【類似於ArrayList的懶加載策略】
11.Bean的作用域
Bean的作用域主要是描述一個bean實例在SpringIOC容器的存在狀態
序號 | 作用域 | 描述 | 應用場景 | 備註 |
1. | singleton | 該作用域下的bean在IoC容器中只存在一個實例,所有對象對其的引用都返回同一個 | 無狀態的Bean | Spring默認選擇該作用域 |
2. | prototype | 每次對該作用域下的Bean的請求都會創建新的實例 | 有狀態的bean | |
3. | request | 每次HTTP請求會創建新的bean實例 | 一次http的請求和響應的共享bean | 限定在SpringMVC |
4. | session | 在一個http Session中,定義一個bean實例 | 用戶會話的共享bean(eg:記錄一個用戶的登錄信息) | 限定SpringMVC中使用 |
5. | global session | 類似於http session,但吸納與portlet web應用可用 | 所有構成某個portlet web 應用的各種不同的portlet所共享 | 限定portlet web應用,在編寫一個標準的基於Servet的web應用,並且定義了一個或多個具有global session作用域的bean,http session作用域,並且不會引起任何錯誤 |
6. | application session | 在一個http servlet Context中,定義一個Bean實例 | web應用的上下文信息(記錄一個用用的共享信息) | 限定SpringMVC中使用 |
12.基於註解配置
無論是通過XML還是註解配置,它們都是表達bean定義的載體,其本質都是爲Spring容器提供bean定義的信息
Spring 容器啓動成功的三大要素:
(1)bean定義信息;
(2)bean實現類;
(3)Spring本身;
12.1使用註解定義bean
@Component標識的類會被Spring容器識別,自動轉爲杯容器管理的bean
基於註解配置需要在XML配置文件中添加:<context:component-scan/>來告訴Spring容器開啓註解bean的掃描
@Repository:用戶DAO實現了進行標識
@Service:用於Service實現類進行標識
@Controller:用於Controller實現類進行標識
12.2 使用註解裝配
9.2.1@Autowired自動裝配
@Autowired默認是按照類型(byType)匹配的方式在容器中查找匹配的Bean,當且僅有一個匹配的bean時,Spring將其注入@Autowired標註的變量中。
9.2.2@Qualifier注入指定bean
9.2.3 @Scope ,@PostConstruct(bean初始化之後調用)@PreDestroy(bean銷燬之前調用)