談談對Spring的概述、特點、常用及核心技術理解

Spring 概述

Spring 是一個開源框架,是爲了解決企業應用程序開發複雜性而創建的(替代更加重量級的企業級Java技術, 尤其是EJB),它完成了大量開發中的通用步驟,留給開發者的僅僅是與特定應用相關的部分,從而大大提高了企業應用的開發效率。
spring可以實現java模塊化開發,貫穿表現層,業務層,邏輯層,實現了各個層之間的解耦合關係。
Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在覈心容器之上,核心容器定義了創建、配置和管理 bean 的方式如下圖:
組成 Spring 框架的每個模塊都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:
☀ Spring 核心容器:核心容器提供 Spring 框架的基本功能,管理着Spring應用中bean的創建、配置和管理。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用DI將應用程序的配置和依賴性規範與實際的應用程序代碼分開。
☀ Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。提供了一種框架式的對象訪問方法,有些象JNDI註冊器。Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明創建,比如說通過Servlet容器。Spring 上下文和Bean工廠都是 bean 容器 的實現。
☀ Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。
☀ 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 MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 核心特點:IOC和AOP

控制反轉模式(IOC)也稱作依賴性介入(DI)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器 (在 Spring 框架中是 IOC 容器) 負責將這些聯繫在一起。在典型的 IOC 場景中,容器創建了所有對象,並設置必要的屬性將它們連接在一起,決定什麼時間調用方法。
Rod Johnson是第一個高度重視以配置文件來管理Java實例的協作關係的人,他給這種方式起了一個名字:控制反轉(Inverse of Control,IoC)。後來Martine Fowler爲這種方式起了另一個名稱:依賴注入(Dependency Injection),因此不管是依賴注入,還是控制反轉,其含義完全相同。
當某個Java對象(調用者)需要調用另一個Java對象(被依賴對象)的方法時,在傳統模式下通常有兩種做法
原始做法: 調用者主動創建被依賴對象,然後再調用被依賴對象的方法
簡單工廠模式: 調用者先找到被依賴對象的工廠,然後主動通過工廠去獲取被依賴對象,最後再調用被依賴對象的方法.
注意上面的主動二字,這必然會導致調用者與被依賴對象實現類的硬編碼耦合,非常不利於項目升級的維護。使用Spring框架之後,調用者無需主動獲取被依賴對象,調用者只要被動接受Spring容器爲調用者的成員變量賦值即可,由此可見,使用Spring後,調用者獲取被依賴對象的方式由原來的主動獲取,變成了被動接受——所以Rod Johnson稱之爲控制反轉。
另外從Spring容器的角度來看,Spring容器負責將被依賴對象賦值給調用者的成員變量——相當於爲調用者注入它依賴的實例,因此Martine Fowler稱之爲依賴注入。
AOP(Aspect Orient Programming)也就是面向切面編程,作爲面向對象編程的一種補充,已經成爲一種比較成熟的編程方式。其實AOP問世的時間並不太長,AOP和OOP互爲補充,面向切面編程將程序運行過程分解成各個切面。
AOP專門用於處理系統中分佈於各個模塊(不同方法)中的交叉關注點的問題,在JavaEE應用中,常常通過AOP來處理一些具有橫切性質的系統級服務,如日誌、事務管理、安全檢查、緩存、對象池管理等,AOP已經成爲一種非常常用的解決方案。
在典型的面向對象開發方式中,可能要將日誌記錄語句放在所有方法和 Java 類中才能實現日誌功能。在 AOP 方式中,可以反過來將日誌服務模塊化,並以聲明的方式將它們應用到需要日誌的組件上,這樣 Java 類就不需要知道日誌服務的存在,也不需要考慮相關的代碼。所以,用 Spring AOP 編寫的應用程序代碼是鬆散耦合的。

Spring 優點總結

⭐ 低侵入式設計,代碼的污染極低:很多框架通過強迫應用繼承它們的類或實現它們的接口而導致應用與框架綁死,而Spring是通過spring特有的註解和通用的pojo結合。Spring的非侵入編程模型意味着這個類在Spring應用和非Spring應用中都可以發揮同樣的作用。Spring的組件就是普通的Java Bean,這也使得單元測試可以不再依賴容器,編寫更加容易。
⭐ 使用模板消除樣板式代碼: 如Spring的JdbcTemplate使得執行數據庫操作時避免傳統的JDBC樣板代碼(創建一個數據庫連接,然後再創建一個語句對象,最後你才能進行查詢,關閉數據庫連接、語句和結果集)成爲了可能。
⭐ 獨立於各種應用服務器:基於Spring框架的應用,可以真正實現Write Once,Run Anywhere的承諾。
⭐ Spring的IoC容器降低了業務對象替換的複雜性,降低了了組件之間的耦合性:對象的依賴關係將由系統中負責協調各對象的第三方組件在創建對象的時候進行設定,所以對象無需自行創建或管理它們的依賴關係,依賴關係將被自動注入到需要它們的對象當中去。而且如果一個對象只通過接口而不是具體實現或初始化過程來表明依賴關係,那麼這種依賴就能夠在對象本身毫不知情的情況下,用不同的具體實現進行替換。
⭐ Spring的AOP支持允許將一些通用任務如安全、事務、日誌等進行集中式管理: 將核心業務和系統服務分離,保持POJO的簡單性和內聚性,從而使他們各自達到更好的複用。
⭐ Spring的ORM和DAO提供了與第三方持久層框架的良好整合,並簡化了底層的數據庫訪問:
⭐ Spring的高度開放性,並不強制應用完全依賴於Spring,開發者可自由選用Spring框架的部分或全部:當Spring不能滿足需求時, 完全可以考慮其他選擇。事實上, Spring甚至提供了與其他第三方框架和類庫的集成點, 這樣你就不需要自己編寫這樣的代碼了。比如以前常用的SSH框架,現在常用的SSM框架

Spring包含許多項目,下面挑一些最常用的出來總結一下。

Spring MVC

Spring MVC是Spring中的基礎 Web 框架,基於模型-視圖-控制器(Model-View-Controller,MVC)模式實現,它能夠幫你構建像Spring框架那樣靈活和鬆耦合的Web應用程序。
在該框架下,一次web請求大致可以分爲如下圖幾個步驟,這些劃分分離了職責,使得代碼靈活、維護性更好。

爲了使用該框架,我們首先要配置DispatchServlet,也就是前端控制器,然後啓用Spring MVC,並編寫控制器,視圖,模型等等。
其中,DispatcherServlet是Spring MVC的核心,DispatcherServlet啓動的時候,它會創建Spring應用上下文,並加載配置文件或配置類中所聲明的bean或者自動掃描的bean,但是在Spring Web應用中,通常還會有另外一個應用上下文,這個應用上下文是由ContextLoaderListener創建的。DispatcherServlet加載包含Web組件的bean,如控制器、視圖解析器以及處理器映射,而ContextLoaderListener要加載應用中的其他bean,通常是驅動應用後端的中間層和數據層組件。
Spring MVC是一個強大靈活的Web框架。藉助於註解,Spring MVC提供了近似於POJO的開發模式,這使得開發處理請求的控制器變得非常簡單,同時也易於測試。而且Spring MVC還支持多種視圖解析器如JSP,Tiles,Thymeleaf,使得前端界面的功能更強大,編寫更容易。
Spring Web Flow

Spring Web Flow是Spring MVC的一個擴展, 它爲基於流程的會話式Web應用(購物車或者嚮導功能)提供了支持。簡言之,它是一個流程框架,能夠引導用戶執行一系列嚮導步驟。
在Spring Web Flow中,流程是由三個主要元素定義的:狀態、轉移和流程數據。狀態( State)是流程中事件發生的地點,在流程中通過轉移的方式從一個狀態到另一個狀態,流程的當前狀況稱爲流程數據。
狀態分爲:
☀ 行爲( Action) 行爲狀態是流程邏輯發生的地方
☀ 決策( Decision) 決策狀態將流程分成兩個方向, 它會基於流程數據的評估結果確定流程方向
☀ 結束( End) 結束狀態是流程的最後一站。 一旦進入End狀態, 流程就會終止
☀ 子流程( Subflow) 子流程狀態會在當前正在運行的流程上下文中啓動一個新的流程
☀ 視圖( View) 視圖狀態會暫停流程並邀請用戶參與流程
轉移連接了流程中的狀態。流程中除結束狀態之外的每個狀態,至少都需要一個轉移,這樣就能夠知道一旦這個狀態完成時流程要去向哪裏。狀態可以有多個轉移,分別對應於當前狀態結束時可以執行的不同的路徑。
當流程從一個狀態進行到另一個狀態時,它會帶走一些流程數據。有時候,這些數據只需要很短的時間(可能只要展現頁面給用戶)。有時候,這些數據會在整個流程中傳遞並在流程結束的時候使用。
Spring Web Flow 可以構建會話式應用程序的Web框架,這是好的,但是感覺其配置只能用xml這個設計不太合理,尤其是當bean很多或者流程節點很多時都不好維護。

Spring Security

安全對於許多應用都是一個非常關鍵的切面,因爲安全性是超越應用程序功能的一個關注點,應用系統的絕大部分內容都不應該參與到與自己相關的安全性處理中。儘管我們可以直接在應用程序中編寫安全性功能相關的代碼,但更好的方式還是將安全性相關的關注點與應用程序本身的關注點進行分離,作爲系統的一個切面。Spring Security就是通過AOP和Filter來爲應用程序實現安全性的。
使用Servlet規範中的Filter保護Web請求並限制URL級別的訪問。Spring Security還能夠使用Spring AOP保護方法調用——藉助於對象代理和使用通知,能夠確保只有具備適當權限的用戶才能訪問安全保護的方法。
Spring Security非常靈活,能夠基於各種數據存儲來認證用戶。它內置了多種常見的用戶存儲場景,如內存、關係型數據庫以及LDAP。但我們也可以編寫並插入自定義的用戶存儲實現。
當爲瀏覽器渲染HTML內容時,你可能希望視圖中能夠反映安全限制和相關的信息。一個簡單的樣例就是渲染用戶的基本信息( 比如顯示“您已經以……身份登錄”)。或者你想根據用戶被授予了什麼權限,有條件地渲染特定的視圖元素。Spring Security本身提供了一個JSP標籤庫,而Thymeleaf通過特定的方言實現了與Spring Security的集成。藉助於這些,可以很容易的實現對視圖的保護。

Spring Data

Spring Data 是爲了簡化構建基於 Spring 框架應用的數據訪問技術,包括關係數據庫、NoSQL、Map-Reduce 框架、雲數據服務等等,旨在提供一種通用、統一的編碼模式(但是並不是代碼完全一樣),使得在Spring中使用任何數據庫都變得非常容易。
Spring Data作爲Spring Source的其中一個父項目,旨在統一和簡化對各類型持久化存儲,而不拘泥於是關係型數據庫還是NoSQL數據存儲。

目前的Spring Data 包含如下的模塊(或者說子項目):
☀ Spring Data Commons
☀ Spring Data JPA
☀ Spring Data KeyValue
☀ Spring Data LDAP
☀ Spring Data MongoDB
☀ Spring Data Gemfire
☀ Spring Data REST
☀ Spring Data Redis
☀ Spring Data for Apache Cassandra
☀ Spring Data for Apache Solr
☀ Spring Data Couchbase (community module)
☀ Spring Data Elasticsearch (community module)
☀ Spring Data Neo4j (community module)
無論是哪種持久化存儲,數據訪問對象(DAO,即Data Access Objects)通常都會提供對單一域對象的CRUD(創建、讀取、更新、刪除)操作、查詢方法、排序和分頁方法等。Spring Data則提供了基於這些層面的統一接口(CrudRepository,PagingAndSortingRepository)以及對持久化存儲的實現。
你可能接觸過某一種Spring模型對象——比如JdbcTemplate——來編寫訪問對象的實現。但是在基於Spring Data的數據訪問對象,我們只需定義和編寫一些查詢方法的接口(基於不同的持續化存儲, 定義有可能稍有不同),Spring Data會在運行時間生成正確的實現。
所有Spring Data的子項目都支持:
 模板:處理資源分配和異常處理
 對象、數據存儲映射:如ORM
 對數據訪問對象的支持: 幫助我們編寫一些模板式語句如分頁排序
然而一些Spring Data子項目,如Spring Data Redis和Spring Data Riak都只是提供模板,這是由於其相應的數據存儲都只支持非結構化的數據,而不適用於對象的映射和查詢。

Spring Boot

Spring誕生時是Java企業版(Java Enterprise Edition, JEE,也稱J2EE)的輕量級代替品。無需開發重量級的Enterprise JavaBean(EJB),Spring爲企業級Java開發提供了一種相對簡單的方法。
雖然Spring的組件代碼是輕量級的,但它的配置卻是重量級的。一開始,Spring用XML配置,而且是很多的XML配置,即使後來有基於註解的改善,我們依然難逃大量配置的魔爪。而Spring Boot讓這一切成爲了過去,如果說Spring的目的是簡化程序的開發,那麼Spring Boot就是爲了簡化Spring本身的開發。
Spring Boot依賴於自動配置技術將Spring應用中樣板式的配置移除掉,這樣就能讓我們免受於一大堆的配置之苦,更加專注於業務功能。Spring Boot同時還提供了多個Starter項目,拿來即可用,極大地簡化了編程任務。
它提供了四個主要的特性,能夠改變開發Spring應用程序的方式:
☀ Spring Boot Starter: 它將常用的依賴分組進行了整合,將其合併到一個依賴中,這樣就可以一次性添加到項目的Maven或Gradle構建中,這裏可以找到目前所有的starter項目。
☀ 自動配置: Spring Boot的自動配置特性利用了Spring 4對條件化配置的支持,合理地推測應用所需的bean並自動化配置它們,減少了你自己需要配置的數量。
☀ 命令行接口(Command-line interface,CLI):Spring Boot的CLI發揮了Groovy編程語言的優勢,並結合自動配置進一步簡化Spring應用的開發。
☀ Actuator: 它爲Spring Boot應用添加了一定的管理特性。

Spring Cloud

在進入主題之前,首先來看看微服務,簡單說來就是將原本單個獨立的大系統拆分爲分佈式的多個小型的服務,這些小型服務各自獨立運行,他們通過HTTP和RestFul API進行通信。
一個微服務一般完成某個特定的功能,比如下單管理、客戶管理等等。每一個微服務都是微型六角形應用,都有自己的業務邏輯和適配器。一些微服務還會發布API給其它微服務和應用客戶端使用。其它微服務完成一個Web UI,運行時,每一個實例可能是一個雲VM或者是Docker容器。
微服務具有分佈式系統的特性,如服務發現,負載均衡,故障轉移,多版本,灰度升級,服務降級,分佈式跟蹤。
Spring Cloud是一套完整的分佈式系統解決方案,它的子項目涵蓋了所有實現分佈式系統所需要的基礎軟件設施(包括配置管理、服務治理、智能路由、全局鎖等等)。基於Spring Boot,Spring Boot做較少的配置,便可成爲Spring Cloud中的一個微服務,使用Spring Cloud的開發者可以快速的啓動服務或構建應用、同時能夠快速和雲平臺資源進行對接,使得開發部署極其簡單。
Spring Cloud專注於提供良好的開箱即用經驗的典型用例和可擴展性機制覆蓋:
☀ 分佈式/版本化配置:Spring Cloud Config
☀ 服務註冊和發現:Netflix Eureka 或者 Spring Cloud Eureka(對前者的二次封裝)
☀ 路由:Spring Cloud Zuul 基於 Netflix Zuul
☀ service - to - service調用:Spring Cloud Feign
☀ 負載均衡:Spring Cloud Ribbon 基於 Netflix Ribbon 實現
☀ 斷路器:Spring Cloud Hystrix
☀ 分佈式消息傳遞:Spring Cloud Bus

Spring的核心概念:

1、Bean管理
2、依賴注入(DI),又稱爲控制反轉(IOC)
3、面向切面編程(AOP)

①Bean管理

與傳統的應用程序不同,在Spring中將對象的創建交給Spring容器來管理,也就是說只有放入Spring容器中的類,Spring才能對其產生作用。那麼Spring究竟是怎樣獲取類的對象的呢?
要想知道這個,我們首先要弄清楚這幾點:
BeanFactory是Spring容器的根接口,ApplicationContext是它的子接口,通常用它的子接口ApplicationContext來訪問Spring容器。
ApplicationContext子接口常用的有四個實現類:
☀ ClassPathXmlApplicationContext 從 classpath 加載 spring 的配置文件
☀ FileSystemApplicationContext 從系統文件加載 spring 的配置文件
☀ AnnotationConfigApplicationContext 獲取基於註解的 spring 容器對象
☀ XmlWebApplicationContext 在 web 環境中獲取 spring 容器對象
Spring通過BeanFactory來獲取這些類的對象,在配置文件中通過節點將類交給Spring進行管理,ApplicationContext的實現類通過getBean()方法從Spring容器中獲取對象,默認爲單例的。

②依賴注入

運行期間,由外部容器動態的將依賴對象注入到組件中,依賴注入讓Baen於Baen之間以配置文件組合在一起,而不是以硬編碼方式耦合在一起,它可以降低類之間的耦合性,有兩種注入方式:
☀ set注入,在配置文件中使用節點
☀ 構造方法注入,在配置文件中使用節點

理解控制反轉:
在傳統的的程序設計過程中,都是在應用內部創建及維護依賴的對象。控制反轉就是應用本身不負責依賴對象的創建及維護,依賴對象的創建及維護是由外部容器負責的,這樣控制權就由應用轉移到外部容器,控制權的轉移就是控制反轉。資源不是由使用資源的雙方進行管理,而是由不使用資源的第三方(即Spring容器)進行管理,這樣做的好處是:
1、資源集中管理,實現資源的可配置與易管理
2、降低使用資源雙方的依賴程度

③面向切面編程

在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程

AOP在Spring中主要表現在兩個方面:
1、提供聲明式事務管理
2、Spring支持用戶自定義切面
面向切面編程是對面向對象編程(OOP)的補充。面向對象編程將程序分解成爲各個層次的對象,面向切面編程將程序運行過程分解成各個切面。面向切面編程基於動態代理實現,降低了類直接的耦合程度。Spring的事務管理就是基於AOP實現的。

1)切面(Pointcut)
切入點加增強
2)連接點(Joinpoint)
目標對象中所有可以增強的方法
3)通知(Advice)
增強的代碼
4)切入點(Pointcut)
目標對象已經增強的方法
5)引入(Introduction)
動態地給一個對象增加方法或屬性的一種特殊的通知
6)織入(Weaving)
將通知放到切入點的過程
7)目標對象(Target)
被代理的對象
8)代理對象(Proxy)
切面織入目標對象之後形成的對象

spring可以實現java模塊化開發,貫穿表現層,業務層,邏輯層,實現了各個層之間的解耦合關係。
IOC:原來service層需要dao層的對象,我們需要直接new出來,而有了spring之後,各個層對象的創建都交給spring來完成,再通過注入的方式將dao對象注入到service層,實現了各層之間的解耦。像我們開始持久層用的hibernate,後面需要切mybatis,直接修改spring中dao層的配置即可。
AOP:面向切面編程,對事務、日誌等進行統一的管理,使我們可以專注於業務的開發,而事務、日誌等其它和當前業務沒有直接關係的操作都通過通知的方式織入到我們的代碼中,若後面不需要記錄日誌了,直接將通知幹掉即可。不需要大量的修改我們原先的代碼。
spring自己本身其實也是一個項目,有很多模塊如springmvc、springdatajpa、springboot等,而且spring、能夠非常方面和當前流行的各種大小的框架進行整合,簡化開發。

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