是什麼讓java世界變得更好,程序員變得更友愛,禿頭率變得不是那麼的高,讓程序員沒必要再天天996,有時間找個女友?前端
是Spring。java
是什麼讓企業級java應用變得簡單易懂,下降了java程序員的進入門檻,致使瞭如今遍地都是java程序員的窘境?react
是Spring。git
是什麼從無冕之王變成了事實上的企業標準,讓規則制定者也要顫抖幾分?程序員
是Spring。github
簡單的說,Spring知足了大家對於java程序的全部想象。是個java程序員都會投入Spring的懷抱。web
今天這篇文件就是對Spring基礎的總結。文末附有小彩蛋,歡迎你們向後拉!算法
Spring是在2003年,做爲對以前的複雜的J2EE規範而產生的。有些人認爲Spring和J2EE是競爭關係,實際上他們是互補的。spring
Spring最新版本是5.3.0, 經過使用Spring,咱們能夠很方便的建立企業級應用程序。同時Spring還提供了對groovy和Kotlin的支持。在Spring5.1以後,須要JDK8以上才能正確運行。數據庫
更多內容請訪問www.flydean.com
狹義的Spring指的是Spring基礎,以下圖所示的Spring Framework Runntime:
廣義的Spring是指整個Spring家族,包括Spring Boot,Spring Cloud等等項目。
這裏咱們探討的是狹義上的Spring Framework。它能夠分爲下面幾個模塊:
Spring Framework被分紅了不少個模塊,咱們在構建應用程序的時候能夠自由選擇使用哪一個模塊。最核心的模塊是核心容器:包括配置模塊和依賴注入機制。除此以外,Spring Framework提供了對不一樣應用架構的基礎支持,包括消息,交易數據,存儲和網站。他還包括了Servlet-based Spring MVC web framework和最新的響應式Spring WebFlux reactive web framework。
Spring的核心技術是Spring中最爲重要的內容,而Core中最最中的就是Spring框架的反轉控制(IOC)容器。
經過在Spring中使用面向方面編程(AOP)技術,IOC在Spring中獲得了全面的應用。而且Spring搭建了本身的AOP框架,同時Spring還提供了對第三方AOP框架AspectJ的集成,從而知足不一樣需求的用戶的使用。
IOC也稱爲依賴注入(DI)。它是指對象僅經過構造函數參數、工廠方法的參數或從工廠方法構造或返回對象實例後,經過在其上設置的屬性來定義其依賴項(即與之一塊兒工做的其餘對象)的過程。當容器在建立bean時將會注入這些依賴項。
這個過程跟bean本身控制實例化,或者經過直接構造類或服務定位器模式來定位其依賴項的方式相反(所以稱爲控制反轉)。
Bean在Spring中就是一個業務組件,咱們經過建立各類Bean來完成最終的業務邏輯功能。
在容器內部,每一個bean的定義能夠被表示爲BeanDefinition,經過BeanDefinition能夠得到bean的不少信息包括:包名,bean的做用域,生命週期,bean的引用和依賴等。
從最開始的面向過程編程,到後面的面向對象編程,程序的編寫方式發生了重大的變化,面向對象編程將業務邏輯封裝成一個一個的對象,全部的操做都轉換爲對對象的操做。
面向對象編程如今使用的很是廣泛,通常來講只要是高級語言都支持,可是它也有缺點,好比若是咱們想作一些橫跨對象的操做(如統計各個對象裏面某個方法的執行時間),這時候面向對象能夠能力有不逮。咱們可能須要在每一個對象裏面都添加一些統計時間的代碼,那麼有沒有更好的方法來處理這個問題呢?
面向方面編程(AOP)經過提供對程序結構的另外一種思考方式來補充面向對象編程(OOP)。OOP中模塊化的關鍵單元是類,而AOP中模塊化的單元是方面。方面支持跨多個類型和對象的關注點(如事務管理)的模塊化。(在AOP文獻中,這種關注一般被稱爲「橫切」關注。)
一般來講一個Bean包含一個默認的無參構造函數,和屬性的get,set方法。
org.springframework.beans 包裏面有個很重要的類叫作BeanWrapper接口和他的實現BeanWrapperImpl,BeanWrapper提供了設置和獲取屬性值(單個或批量)、獲取屬性描述符和查詢屬性的功能,以肯定它們是可讀的仍是可寫的。
此外,BeanWrapper還支持嵌套屬性,容許將子屬性的屬性設置爲無限深度。BeanWrapper還支持添加標準JavaBeans屬性PropertyChangeListeners和VetoableChangeListeners,而不須要在目標類中支持代碼。最後,BeanWrapper提供了對設置索引屬性的支持。BeanWrapper一般不直接由應用程序代碼使用,而是由DataBinder和BeanFactory使用。
Spring提供了很方便的事件的處理機制,包括事件類ApplicationEvent和事件監聽類ApplicationListener。 他實現的是設計者模式,若是實現了ApplicationListener接口的bean部署到Spring容器中,則每次ApplicationEvent發佈到ApplicationContext時,都會通知該bean。
SpEL的全稱叫作Spring Expression Language。一般是爲了在XML或者註解裏面方便求值用的,經過編寫#{ }這樣的格式,便可使用。
Spring定義了Resource接口用來對資源的訪問,通常來講資源有兩種形式,一種是URL的形式從外部連接加載,一種是File的形式從系統自己查找。
Spring團隊提倡測試驅動開發(TDD)。 Spring團隊發現正確使用控制反轉(IoC)確定會使單元測試和集成測試更容易(由於類的setter方法和適當的構造函數的存在使得它們更容易在測試中鏈接在一塊兒而沒必要設置服務定位器註冊表和相似結構)。
例子待續...
經過Spring能夠方便的進行事物管理,而且爲各類數據訪問技術(例如JDBC,Hibernate或JPA)提供了一致性的DAO接口,從而能夠輕鬆地在上述持久性技術之間進行切換,不須要考慮對各類數據訪問技術的適配問題。
例子待續...
Spring提供了Spring MVC框架來實現對web的支持,與其餘許多Web框架同樣,Spring MVC圍繞前端控制器模式進行設計,在該模式下,中央Servlet DispatcherServlet提供了用於請求處理的共享算法,而實際工做是由可配置的委託組件執行的。 該模型很是靈活,並支持多種工做流程。
與任何Servlet同樣,都須要根據Servlet規範使用Java配置或在web.xml中聲明和映射DispatcherServlet。 反過來,DispatcherServlet使用Spring配置發現請求映射,視圖解析,異常處理等所需的委託組件。
除了對於傳統的Web Servlet的支持之外,Spring還引入了WebFlux框架和響應式WebClient,實現了對reactive系統的支持。
WebFlux框架是非阻塞的,須要在並在Netty,Undertow和Servlet 3.1+容器等服務器上運行。
例子待續...
曾經的我很幼稚的花了幾個月的時間,一句話一句話的來翻譯官方的Spring 5.x文檔,如今這裏奉獻給你們,歡迎你們下載,能夠的話你們關注我一下,給我點個贊,謝謝了:
不想下載的朋友能夠經過這個連接直接閱讀 Spring-Framework-Documentation中文文檔閱讀連接
本文做者:flydean程序那些事
本文來源:flydean的博客
歡迎關注個人公衆號:程序那些事,更多精彩等着您!