爲何要有Spring?
不管在解析源碼,仍是在看待其餘問題上,首先先來看第一個問題,爲何要有Spring?爲何Spring這麼流行?爲何會有Spring?前端
C++這個語言相信瞭解過的都知道,其對象是須要手動回收的,而Java的優勢之一就是會自動回收不用了的對象。可是若是在一個項目中,若是建立的對象過多,這個建立速度超過了達到回收條件的時限時,內存就會爆掉。那麼不少人就會想,不少建立的對象其實都是重複的,可否把這些對象集中起來,不用重複去建立,提升整個對象的利用率,那麼就能夠下降整個建立過多對象而致使內存爆掉的問題發生機率了。java
應運而生的Spring就出來了,或者說Spring就是帶着這樣的初衷而出生的。全部的對象都交給Spring這個容器(IOC容器)去管理,那麼還節省了開發人員維護這個對象的功夫,還可讓其餘框架的對象同樣也交給Spring去管理就能夠了,那麼即使在一個項目應用多個框架的話,維護起來也不會麻煩,若是這個框架不用,那麼就把其從Spring容器中移除,不在管理(解耦)便可。程序員
什麼是Spring?
官方的定義是:Spring框架是一種輕量級的階級方案,是構建企業級應用程序的潛在一站式解決方案。web
在寫這篇文章時,即使在一開始思考了爲何會有Spring這個框架以後,我也在想,什麼是Spring?官方寫的含糊其辭的,那麼我又在想Spring就是IOC和AOP了嗎?面試
在結合在之前項目的應用和各類遇到的坑,我給予Spring的定義是:管理項目中全部主動注入容器中的對象的框架。spring
給予這個定義的緣由在於,每次作項目和麪試時,別人問咱們都會給予一個回答SSM,Spring必然是包含在其中的,而且Spring用多種形式(單例/多例)管理注入到IOC容器中的對象。數據庫
Spring是面向Bean的編程(BOP:Bean Oriented Programming),Bean在Spring中才是真正的主角,即對象。Bean在Spring中的做用就像Object對OOP的意義同樣,沒有對象的概念就像沒有面向對象編程,Spring中沒有Bean也就沒有Spring存在的意義。Spring提供了經過配置文件或者註解的方式來管理對象之間的依賴關係。express
控制反轉(Inversion Of Control,IOC):是面向對象編程中的一種設計原則,能夠用來減低代碼之間的耦合度。其中最多見的方式叫依賴注入(Denpendency Injection,DI),還有一種方式叫依賴查找(Dependency Lookup)。編程
過程:經過控制反轉,對象在被建立時,由一個調控系統內全部對象的外界實體,將其依賴的對象的引用傳遞給它,即依賴被注入的到對象。數組
Spring體系
SpringCore |
|
SpringContext |
上下文容器,是BeanFactory功能增強的一個接口 |
SpringWeb |
提供Web開發 |
SpringMVC |
針對Web應用的MVC思想 |
SpringDAO |
提供JDBC抽象層,簡化了JDBC編碼,同時編碼更具備健壯性 |
SpringORM |
與流行的ORM框架結合 |
SpringAOP |
面向切面編程 |
Spring框架結構(v 5.x)
核心容器層(Core Container)
Core Container(核心容器):包含有Beans、Core、Context、ExpressionLanguae模塊。其中Core和Beans模塊是框架的基礎部分,提供IOC(控制反轉)和DI(依賴注入)特性。這裏的基礎概念是BeanFactory,它提供Factory模式的經典實現來消除對程序性單例模式的須要,並真正的容許你從程序邏輯中分離出依賴關係和配置。
Core模塊:主要包含Spring框架基本的核心工具類,Spring的其餘組件都要使用到這個包裏的類,Core模塊是其餘組件的基本核心。
Beans模塊:這個是全部應用都要用到的,包含訪問配置文件、建立和管理Bean,以及進行Inversion of Control/Dependency Inection(IOC/DI)操做相關的全部類。
Context模塊:構建於Core和Beans模塊基礎之上,提供了一種相似於JNDI註冊器的框架式對象訪問方法。Context模塊基礎了Beans的特性,爲Spring核心提供了大量擴展,添加了對國際化(例如資源綁定)、事件傳播、資源加載和對Context的透明建立的支持。Contet同時也支持J2EE的一些特性,例如EJB、JMX和基礎的遠程處理。AppliationContext接口是Contetext模塊的關鍵。
Expression Language模塊:提供了一個強大的表達式語音用於在運行時查詢和操做對象。是JSP2.1規範中定義的Unifedexpression Language的一個擴展。這個語言支持設置/獲取屬性值,屬性的分配,方法的調用,訪問數組上下文,容器和索引器,邏輯和算術運算符,命名變量以及Spring的IOCring器中根據名稱檢索對象,它也支持List投影,選擇和通常的List聚合。
串聯:Beans模塊是用於操做對象進行的IOC/DI的。Core模塊提供工具類方法,用於整個Spring框架。Context模塊是在Beans和Core模塊已經完成了對對象的IOC/DI的操做以後,提供了面向不一樣環境的一些高級特性(國際化)。Expression Language模塊則是爲了方面全部的模塊進行編寫,好比 * 這個字符的解析。
數據訪問/集成層(Data Access/Integration)
這個在聽名字就知道了,就是提供與其餘中間件的交互模塊的,包括有JDBC、OXM、JMS、Transaction模塊。
JDBC模塊:提供了一個JDBC抽象層,能夠消除冗長的JDBC編碼和解析數據庫廠商的錯誤代碼。這個模塊包含了Spring對JDBC數據訪問進行封裝的全部類。
ORM(Object Relational Mapping):名爲對象關係映射模塊,這個爲對象-關係映射的API,如Hibernate、Mybatis這些ORM框架,提供了一個交互層,利用ORM封裝包,能夠混合使用全部Spring提供的特性進行O/R映射。如簡單的聲明式事務管理。
Spring框架插入了若干個ORM框架,從而提供了ORM的對象關係工具,其中包括JDO、Hibernate、MybatisSQL Map。全部這些都聽從Spring的通用事務和DAO異常層次結構。
OXM模塊:提供了一個對Object/XML映射實現的抽象層,Object/XML映射實現包括JAXB、Castor、XMLBeans、JiBX和XStream。
JMS(Java Messageing Service)模塊:包括了一些製造和消費消息的特性。
Transaction模塊:支持編程和聲明式的事務管理,這些事務類必須實現特定的接口,而且對全部POJO都適用。
Web層
Web上下文模塊創建在應用程序上下文模塊之上,爲基於Web的應用成提供了上下文。因此Spring框架支持與Jakarta Struts的集成。Web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做。Web層包含了Web、Web-Servlet、Web-Struts和Web-Porlet模塊。
Web模塊:提供了基礎的面向Web的集成特性,好比多文件上傳,使用Servlet LiSteners初始化IOC容器以及一個面向Web的應用上下文,還包含Srping遠程支持中Web的相關部分。
Web-MVC模塊:包含Spring的Model-View-Controller(MVC)的實現。Spring的MVC框架使得模型範圍內的代碼和Web Forms之間可以清楚的分離開來,並與Spring框架的其餘特性集成在一塊兒。
Web-Socket模塊:提供了與Web前端的全雙工通信協議。
Web-Flux模塊:是一個新的非阻塞函數式Reactive Web框架,能夠用來創建異步、非阻塞,事件驅動的服務,而且擴展性很是好。
串聯:Web模塊提供基礎。WebMVC模塊提供MVC分離。Web-Socket模塊在Web模塊和WebMVC模塊的基礎上提供代碼解耦的網絡連接。WebFlux模塊提供非阻塞的形式來去實現NIO的特性。
AOP、Aspects、Instrmentation(設備支持)
AOP(Aspect Oraiented Programming)模塊:AOP模塊提供了一個符合AOP聯盟標準的面向切面編程的實現,可讓定義例如方法攔截器和切點。從而將邏輯代碼分開,下降耦合性。利用Source-Level的元數據功能,還能夠將各類行爲信息合併到代碼中。
經過Spring配置管理的特性,Spring AOP模塊之間將面向切面的功能集成到Spring框架中,因此很容易的使得Spring框架管理的任何對象支持AOP。爲基於Spring的應用成的對象提供事務管理服務。經過使用Spring AOP,不用依賴EJB組件,就能夠加個聲明式事務管理集成到應用程序中。
Aspects模塊:提供AspectJ的集成支持,AspectJ是一個面向切面的框架,而且它還擴展了Java語言,主要是爲Spring AOP提供多種AOP實現方法。
Instrumentation(設備支持)模塊:提供了Class Instrumentation(類儀器)支持和Class Loader(類加載)的實現,使得能夠在特定的應用服務器上使用。應該算是AOP的一個支援模塊,主要做用是在JVM啓用時,生成一個代理類,開發者能夠經過代理類在運行時修改類的字節,從而改變一個類的功能,實現AOP的功能。
Messaging
Messaging模塊:這是從Spring4開始新加入的一個模塊,主要是爲Spring框架繼承一些基礎的報文傳送應用。
Test層
Test模塊:用於使用Junit和TestNG對Spring組件進行測試。
串聯
核心容器層(Core Container)提供了基礎,幫助應用管理對象。
數據訪問/集成層(Data Access/Integration)提供了對象與數據庫的交互性映射。
Web層提供了網絡交互的相關組件。
AOP、Asepects、Instramenetation提供了輔助型的加強功能,讓整個開發更簡單,也加強了健壯性(好比AOP日誌)。
Message提供了對一些消息的報文傳送的優化等內容,爲其餘層提供加強型的輔助功能。
Test層爲其餘層加強了健壯性。
Spring源碼結構(v5.2.7.RELEASE)
在瀏覽器搜索不少Spring源碼解析相關的文章,一上來就告訴你Spring IOC是什麼?源碼是怎麼樣的?讓咱們很困惑,在瞭解了Spring的框架結構以後,會發現其實Spring源碼閱讀彷佛只須要閱讀其中一些核心模塊便可,其餘的輔助模塊實際上是能夠在使用到在去閱讀的。
如今在來看看Spring的源碼結構到底是怎麼樣的,以及和剛剛講的Spring框架結構有什麼關聯。
Srping總共大約有20個模塊,1300多個不一樣的文件組成。而這些組件被分別整合在覈心容器層(Core Container)、數據訪問及集成(Data Access/Integeration)、AOP、Web、Messaging、Test這幾個模塊中。
核心容器層(Core Container)
核心層是這4個模塊組成的。一、spring-beans,二、spring-core,三、spring-cotext,四、spring-expression。
spring-beans和spring-core模塊:是Spring框架的核心模塊,包含了IOC(控制反轉,Inversion of Control)和DI(依賴注入,Dependency Injection)。BeanFactory接口是Spring框架中的核心結構,它是工廠模式的具體實現。
BeanFactory使用控制反轉對應用程序的配置和依賴性規範與實際應用程序代碼進行分離。但BeanFactory容器實例化後並不會自動實例化Bean,只有當Bean被使用時,BeanFactory纔會對該Bean進行實例化與依賴關係的裝配。
spring-context模塊:構架於spring-beans和spring-core模塊之上,這個模塊擴展了BeanFactory,爲BeanFactory添加了Bean生命週期控制、框架事件體系以及資源加載透明化等功能。並且這個模塊還提供了不少企業級的支持,好比郵件訪問、遠程控制、任務調度等。
ApplicationContext是該模塊的核心接口,是BeanFactory的超類,與BeanFactory不一樣,ApplicationCotext容器實例化後會自動對全部的單實例Bean進行實例化與依賴關係的裝配,使之處於待用狀態。
spring-expression模塊:統一表達式語言(EL)的擴展模塊,能夠查詢、管理運行中的對象,同時也方便的能夠調用對象方法、操做數組、集合等。語法相似於傳統EL,但提供了額外的功能,最出色的就是函數調用和簡單字符串的模板函數,這樣的語言特性是基於Spring產品的需求而設計,使其能夠很是方便的與Spring IOC進行交互。
數據訪問/集成層(Data Access/Integration)
數據訪問/集成層是這5個模塊組成。一、spring-jdbc,二、spring-tx,三、spring-orm,四、spring-jms,五、spring-oxm。
spring-jdbc模塊:這個是Spring提供的JDBC抽象框架的主要實現模塊,用於簡化Spring JDBC。主要是提供JDBC的模板方式、關係數據庫對象化方式、SimpleJdbc方式、事務管理來簡化JDBC編程,主要實現類是JdbcTemplate、SimpleJdbcTemplate、NamedParameterJdbcTemplate。
spring-tx模塊:這個是Spring JDBC事務控制實現模塊。Spring框架對事務作了很好的封裝,經過它的AOP配置,能夠靈活的配置在任何一層。可是在不少需求和應用中,直接使用JDBC事務控制仍是有優點的。
其實事務是以業務邏輯爲基礎的,一個完整的業務應該對應業務層裏的一個方法。若是業務操做失敗,則整個事務回滾。因此事務控制絕對應該放在業務層的。可是持久層的設計則應該遵循保證操做的原子性,即持久層裏的每一個方法都是不能夠分割的。因此在使用Spring JDBC事務時,要特別注意其特殊性。
spring-orm模塊:這個是ORM框架的支撐模塊,主要集成Hibernate、Java Persistence API(JPA)和Java Data Objects(JDO)用於資源管理、數據訪問對象(DAO)的實現和事務策略。
spring-jmx(Java Messaging Service)模塊:能顧發送和接受信息,自Spring Framework 4.1之後,還提供了對spring-messaging模塊的支撐。
spring-oxm模塊:提供了一個抽象層以支撐OXM(Object XML Mapping),是一個O/M-mapper,將java對象映射成XML數據,或者講XML數據映射成java對象,好比JAXB、XMLBeans、XStream等。
Web層
Web層是這4個模塊組成的。一、spring-web,二、spring-webmvc,三、spring-websocket,四、spring-webflux。
spring-web模塊:這個模塊爲Spring提供了最基礎的Web支持,主要創建於核心容器之上,經過Servlet或Listeners來初始化IOC容器,也包含一些魚Web相關的支持。
spring-webmvc模塊:這個模塊衆所周知是一個Web-Servlet模塊,實現了Spring MVC(Model-View-Controller)的Web應用。
spring-websocket模塊:主要是與Web前端的全雙工通信的協議。
spring-webflux模塊:是一個新的非阻塞函數式Reactive Web框架,能夠用來創建異步的,非阻塞的事件驅動的服務,而且擴展性很好。
AOP、Aspects、Instrmentation(設備支持)
這一層是這3個模塊組成的。一、spring-aop、二、spring-aspects、三、spring-instrument。
spring-aop模塊:這個是Spring的另外一大核心模塊,是AOP主要的實現模塊,做爲繼OOP後,對程序影響最大的編程思想之一,AOP極大的開拓了人們對於編程的思路。在Spring中,他是以JVM的動態代理技術爲基礎,而後設計出一系列的AOP橫切實現,好比前置通知、返回通知、異常通知等。同時,Pointcut接口來匹配切入點,可使用現有的切入點來設計橫切面,也能夠擴展相關方法根據需求進行切入。
spring-aspects模塊:這個是集成AspectJ框架,主要是爲Spring AOP提供多種AOP實現方法。
spring-instrument(設備支持)模塊:這個是基於Java SE中的java.lang.instrument進行設計的,應該算是AP一個支援模塊,主要做用是在JVM啓動時,生成一個代理類,程序員經過代理類在運行時修改類的字節,從而改變一個類的功能,實現AOP的功能。
Messaging
Messaging這一層是1個模塊組成。一、spring-messaging。
spring-messaging模塊:這個是從Spring4開始新加入的一個模塊,主要職責是爲Spring框架集成一些基礎的報文傳送應用。
Test層
Test這一層是1個模塊組成。一、spring-test。
spring-test模塊:主要是爲測試提供支持的,畢竟在不須要發佈(程序)到你的應用服務器或者連接到其餘企業設施的狀況下可以執行一些集成測試或其餘測試。