簡介
是什么讓java世界變得更好,程序員變得更友愛,禿頭率變得不是那么的高,讓程序員不必再每天996,有時間找個女朋友?
是Spring。
是什么讓企業(yè)級java應(yīng)用變得簡單易懂,降低了java程序員的進入門檻,導(dǎo)致了現(xiàn)在遍地都是java程序員的窘境?
是Spring。
是什么從無冕之王變成了事實上的企業(yè)標(biāo)準(zhǔn),讓規(guī)則制定者也要顫抖幾分?
是Spring。
簡單的說,Spring滿足了你們對于java程序的所有想象。是個java程序員都會投入Spring的懷抱。
今天這篇文件就是對Spring基礎(chǔ)的總結(jié)。文末附有小彩蛋,歡迎大家向后拉!
Spring基礎(chǔ)
Spring是在2003年,作為對之前的復(fù)雜的J2EE規(guī)范而產(chǎn)生的。有些人認(rèn)為Spring和J2EE是競爭關(guān)系,實際上他們是互補的。
Spring最新版本是5.3.0, 通過使用Spring,我們可以很方便的創(chuàng)建企業(yè)級應(yīng)用程序。同時Spring還提供了對groovy和Kotlin的支持。在Spring5.1之后,需要JDK8以上才能正確運行。
更多內(nèi)容請訪問www.flydean.com
狹義的Spring指的是Spring基礎(chǔ),如下圖所示的Spring Framework Runntime:
廣義的Spring是指整個Spring家族,包括Spring Boot,Spring Cloud等等項目。
這里我們探討的是狹義上的Spring Framework。它可以分為下面幾個模塊:
- Core - Core是Spring得以運行的核心,主要包括IoC Container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP等內(nèi)容。
- Testing - 測試是Spring中非常重要的一個模塊,主要包括Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient等內(nèi)容。
- Data Access - 這一部分是對數(shù)據(jù)庫的訪問相關(guān),包括Transactions, DAO Support, JDBC, O/R Mapping, XML Marshalling等內(nèi)容。
- Web Servlet - 傳統(tǒng)的對Web Servlet的支持,包括Spring MVC, WebSocket, SockJS, STOMP Messaging等內(nèi)容。
- Web Reactive - 這是Spring5新增的對于響應(yīng)式系統(tǒng)的支持,包括Spring WebFlux, WebClient, WebSocket等。
- Integration - 是對第三方系統(tǒng)的支持,包括Remoting, JMS, JCA, JMX, Email, Tasks, Scheduling, Caching等常用的第三方系統(tǒng)。
- Languages - 最后是對其他JVM語言的支持,包括Kotlin, Groovy等動態(tài)語言。
Spring Framework被分成了很多個模塊,我們在構(gòu)建應(yīng)用程序的時候可以自由選擇使用哪個模塊。最核心的模塊是核心容器:包括配置模塊和依賴注入機制。除此之外,Spring Framework提供了對不同應(yīng)用架構(gòu)的基礎(chǔ)支持,包括消息,交易數(shù)據(jù),存儲和網(wǎng)站。他還包括了Servlet-based Spring MVC web framework和最新的響應(yīng)式Spring WebFlux reactive web framework。
Core核心技術(shù)
Spring的核心技術(shù)是Spring中最為重要的內(nèi)容,而Core中最最中的就是Spring框架的反轉(zhuǎn)控制(IOC)容器。
通過在Spring中使用面向方面編程(AOP)技術(shù),IOC在Spring中得到了全面的應(yīng)用。并且Spring搭建了自己的AOP框架,同時Spring還提供了對第三方AOP框架AspectJ的集成,從而滿足不同需求的用戶的使用。
IOC也稱為依賴注入(DI)。它是指對象僅通過構(gòu)造函數(shù)參數(shù)、工廠方法的參數(shù)或從工廠方法構(gòu)造或返回對象實例后,通過在其上設(shè)置的屬性來定義其依賴項(即與之一起工作的其他對象)的過程。當(dāng)容器在創(chuàng)建bean時將會注入這些依賴項。
這個過程跟bean自己控制實例化,或者通過直接構(gòu)造類或服務(wù)定位器模式來定位其依賴項的方式相反(因此稱為控制反轉(zhuǎn))。
Bean在Spring中就是一個業(yè)務(wù)組件,我們通過創(chuàng)建各種Bean來完成最終的業(yè)務(wù)邏輯功能。
在容器內(nèi)部,每個bean的定義可以被表示為BeanDefinition,通過BeanDefinition可以獲得bean的很多信息包括:包名,bean的作用域,生命周期,bean的引用和依賴等。
- Spring5參考指南:Bean的創(chuàng)建
- Spring5參考指南:Bean作用域
- Spring5參考指南:Bean的生命周期管理
- Spring5參考指南:容器擴展
- Spring5參考指南:基于注解的容器配置
- Spring5參考指南:組件掃描
- Spring5參考指南:JSR 330標(biāo)準(zhǔn)注解
從最開始的面向過程編程,到后面的面向?qū)ο缶幊蹋绦虻木帉懛绞桨l(fā)生了重大的變化,面向?qū)ο缶幊虒I(yè)務(wù)邏輯封裝成一個一個的對象,所有的操作都轉(zhuǎn)換為對對象的操作。
面向?qū)ο缶幊态F(xiàn)在使用的非常普遍,一般來說只要是高級語言都支持,但是它也有缺點,比如如果我們想做一些橫跨對象的操作(如統(tǒng)計各個對象里面某個方法的執(zhí)行時間),這時候面向?qū)ο罂梢阅芰τ胁淮N覀兛赡苄枰诿總€對象里面都添加一些統(tǒng)計時間的代碼,那么有沒有更好的方法來處理這個問題呢?
面向方面編程(AOP)通過提供對程序結(jié)構(gòu)的另一種思考方式來補充面向?qū)ο缶幊蹋∣OP)。OOP中模塊化的關(guān)鍵單元是類,而AOP中模塊化的單元是方面。方面支持跨多個類型和對象的關(guān)注點(如事務(wù)管理)的模塊化。(在AOP文獻中,這種關(guān)注通常被稱為“橫切”關(guān)注。)
- Spring5參考指南:SpringAOP簡介
- Spring5參考指南:AspectJ注解
- Spring5參考指南:基于Schema的AOP
- Spring5參考指南:AOP代理
- Spring5參考指南:AspectJ高級編程之Configurable
通常來說一個Bean包含一個默認(rèn)的無參構(gòu)造函數(shù),和屬性的get,set方法。
org.springframework.beans 包里面有個很重要的類叫做BeanWrapper接口和他的實現(xiàn)BeanWrapperImpl,BeanWrapper提供了設(shè)置和獲取屬性值(單個或批量)、獲取屬性描述符和查詢屬性的功能,以確定它們是可讀的還是可寫的。
此外,BeanWrapper還支持嵌套屬性,允許將子屬性的屬性設(shè)置為無限深度。BeanWrapper還支持添加標(biāo)準(zhǔn)JavaBeans屬性PropertyChangeListeners和VetoableChangeListeners,而不需要在目標(biāo)類中支持代碼。最后,BeanWrapper提供了對設(shè)置索引屬性的支持。BeanWrapper通常不直接由應(yīng)用程序代碼使用,而是由DataBinder和BeanFactory使用。
Spring提供了很方便的事件的處理機制,包括事件類ApplicationEvent和事件監(jiān)聽類ApplicationListener。 他實現(xiàn)的是設(shè)計者模式,如果實現(xiàn)了ApplicationListener接口的bean部署到Spring容器中,則每次ApplicationEvent發(fā)布到ApplicationContext時,都會通知該bean。
SpEL的全稱叫做Spring Expression Language。通常是為了在XML或者注解里面方便求值用的,通過編寫#{ }這樣的格式,即可使用。
Spring定義了Resource接口用來對資源的訪問,一般來說資源有兩種形式,一種是URL的形式從外部鏈接加載,一種是File的形式從系統(tǒng)本身查找。
Testing測試
Spring團隊提倡測試驅(qū)動開發(fā)(TDD)。 Spring團隊發(fā)現(xiàn)正確使用控制反轉(zhuǎn)(IoC)肯定會使單元測試和集成測試更容易(因為類的setter方法和適當(dāng)?shù)臉?gòu)造函數(shù)的存在使得它們更容易在測試中連接在一起而不必設(shè)置服務(wù)定位器注冊表和類似結(jié)構(gòu))。
例子待續(xù)...
Data Access
通過Spring可以方便的進行事物管理,并且為各種數(shù)據(jù)訪問技術(shù)(例如JDBC,Hibernate或JPA)提供了一致性的DAO接口,從而可以輕松地在上述持久性技術(shù)之間進行切換,不需要考慮對各種數(shù)據(jù)訪問技術(shù)的適配問題。
例子待續(xù)...
Web Servlet
Spring提供了Spring MVC框架來實現(xiàn)對web的支持,與其他許多Web框架一樣,Spring MVC圍繞前端控制器模式進行設(shè)計,在該模式下,中央Servlet DispatcherServlet提供了用于請求處理的共享算法,而實際工作是由可配置的委托組件執(zhí)行的。 該模型非常靈活,并支持多種工作流程。
與任何Servlet一樣,都需要根據(jù)Servlet規(guī)范使用Java配置或在web.xml中聲明和映射DispatcherServlet。 反過來,DispatcherServlet使用Spring配置發(fā)現(xiàn)請求映射,視圖解析,異常處理等所需的委托組件。
Web Reactive
除了對于傳統(tǒng)的Web Servlet的支持以外,Spring還引入了WebFlux框架和響應(yīng)式WebClient,實現(xiàn)了對reactive系統(tǒng)的支持。
WebFlux框架是非阻塞的,需要在并在Netty,Undertow和Servlet 3.1+容器等服務(wù)器上運行。
例子待續(xù)...
總結(jié)
曾經(jīng)的我很幼稚的花了幾個月的時間,一句話一句話的來翻譯官方的Spring 5.x文檔,現(xiàn)在這里奉獻給大家,歡迎大家下載,可以的話大家關(guān)注我一下,給我點個贊,謝謝了:
不想下載的朋友可以通過這個鏈接直接閱讀 Spring-Framework-Documentation中文文檔閱讀鏈接
本文作者:flydean程序那些事
本文鏈接:http://www.flydean.com/spring5/
本文來源:flydean的博客
歡迎關(guān)注我的公眾號:程序那些事,更多精彩等著您!