1. 程式人生 > >spring原始碼解析(一)邁向學習spring之路

spring原始碼解析(一)邁向學習spring之路




  Spring總共大約有20個模組,由1300多個不同的檔案構成。而這些元件被分別整合在核心容器(CoreContainer)、Aop(AspectOrientedProgramming)和裝置支援(Instrmentation)、資料訪問及整合(DataAccess/Integeration)、Web、報文傳送(Messaging)、Test,6個模組集合中。


  組成Spring框架的每個模組集合或者模組都可以單獨存在,也可以一個或多個模組聯合實現。每個模組的組成和功能如下:


  1.核心容器:由spring-beans、spring-core、spring-context和spring-expression(SpringExpressionLanguage,SpEL)4個模組



  spring-beans和spring-core模組是Spring框架的核心模組,包含了控制反轉(InversionofControl,IoC)和依賴注入(DependencyInjection,DI)。BeanFactory介面是Spring框架中的核心介面,它是工廠模式的具體實現。BeanFactory使用控制反轉對應用程式的配置和依賴性規範與實際的應用程式程式碼進行了分離。但BeanFactory容器例項化後並不會自動例項化Bean,只有當Bean被使用時BeanFactory容器才會對該Bean進行例項化與依賴關係的裝配。


  spring-contest模組構架於核心模組之上,他擴充套件了BeanFactory,為她添加了Bean生命週期控制、框架事件體系以及資源載入透明化等功能。此外該模組還提供了許多企業級支援,如郵件訪問、遠端訪問、任務排程等,ApplicationContext是該模組的核心介面,她是BeanFactory的超類,與BeanFactory不同,ApplicationContext容器例項化後會自動對所有的單例項Bean進行例項化與依賴關係的裝配,使之處於待用狀態。



  spring-expression模組是統一表達式語言(unifiedEL)的擴充套件模組,可以查詢、管理執行中的物件,同時也方便的可以呼叫物件方法、運算元組、集合等。它的語法類似於傳統EL,但提供了額外的功能,最出色的要數函式呼叫和簡單字串的模板函式。這種語言的特性是基於Spring產品的需求而設計,他可以非常方便地同SpringIoC進行互動。


2.Aop和裝置支援:由spring-aop、spring-aspects和spring-instrumentation3個模組組成。


  spring-aop是Spring的另一個核心模組,是Aop主要的實現模組。作為繼OOP後,對程式設計師影響最大的程式設計思想之一,Aop極大地開拓了人們對於程式設計的思路。在Spring中,他是以JVM的動態代理技術為基礎,然後設計出了一系列的Aop橫切實現,比如前置通知、返回通知、異常通知等,同時,Pointcut介面來匹配切入點,可以使用現有的切入點來設計橫切面,也可以擴充套件相關方法根據需求進行切入。



  spring-aspects模組整合自AspectJ框架,主要是為SpringAop提供多種Aop實現方法。


  spring-instrumentation模組是基於JAVASE中的"java.lang.instrument"進行設計的,應該算是Aop的一個支援模組,主要作用是在JVM啟用時,生成一個代理類,程式設計師通過代理類在執行時修改類的位元組,從而改變一個類的功能,實現Aop的功能。在分類裡,我把他分在了Aop模組下,在Spring官方文件裡對這個地方也有點含糊不清,這裡是純個人觀點。


3.資料訪問及整合:由spring-jdbc、spring-tx、spring-orm、spring-jms和spring-oxm5個模組組成。


  spring-jdbc模組是Spring提供的JDBC抽象框架的主要實現模組,用於簡化SpringJDBC。主要是提供JDBC模板方式、關係資料庫物件化方式、SimpleJdbc方式、事務管理來簡化JDBC程式設計,主要實現類是JdbcTemplate、SimpleJdbcTemplate以及NamedParameterJdbcTemplate。


  spring-tx模組是SpringJDBC事務控制實現模組。使用Spring框架,它對事務做了很好的封裝,通過它的Aop配置,可以靈活的配置在任何一層;但是在很多的需求和應用,直接使用JDBC事務控制還是有其優勢的。其實,事務是以業務邏輯為基礎的;一個完整的業務應該對應業務層裡的一個方法;如果業務操作失敗,則整個事務回滾;所以,事務控制是絕對應該放在業務層的;但是,持久層的設計則應該遵循一個很重要的原則:保證操作的原子性,即持久層裡的每個方法都應該是不可以分割的。所以,在使用SpringJDBC事務控制時,應該注意其特殊性。


  spring-orm模組是ORM框架支援模組,主要整合Hibernate,JavaPersistenceAPI(JPA)和JavaDataObjects(JDO)用於資源管理、資料訪問物件(DAO)的實現和事務策略。


  spring-jms模組(JavaMessagingService)能夠傳送和接受資訊,自SpringFramework4.1以後,他還提供了對spring-messaging模組的支撐。


  spring-oxm模組主要提供一個抽象層以支撐OXM(OXM是Object-to-XML-Mapping的縮寫,它是一個O/M-mapper,將java物件對映成XML資料,或者將XML資料對映成java物件),例如:JAXB,Castor,XMLBeans,JiBX和XStream等。


 4.Web:由spring-web、spring-webmvc、spring-websocket和spring-webmvc-portlet4個模組組成。


  spring-web模組為Spring提供了最基礎Web支援,主要建立於核心容器之上,通過Servlet或者Listeners來初始化IoC容器,也包含一些與Web相關的支援。


  spring-webmvc模組眾所周知是一個的Web-Servlet模組,實現了SpringMVC(model-view-controller)的Web應用。


  spring-websocket模組主要是與Web前端的全雙工通訊的協議。(資料缺乏,這是個人理解)


  spring-webmvc-portlet模組是知名的Web-Portlets模組(Portlets在Web門戶上管理和顯示的可插拔的使用者介面元件。Portlet產生可以聚合到門戶頁面中的標記語言程式碼的片段,如HTML,XML等),主要是為SpringMVC提供Portlets元件支援。


5.報文傳送:即spring-messaging模組。


  spring-messaging是Spring4新加入的一個模組,主要職責是為Spring框架整合一些基礎的報文傳送應用。


  6.Test:即spring-test模組。


  spring-test模組主要為測試提供支援的,畢竟在不需要釋出(程式)到你的應用伺服器或者連線到其他企業設施的情況下能夠執行一些整合測試或者其他測試對於任何企業都是非常重要的。


  Spring體系的核心是IoC和Aop模組。對於kernel而言,程序排程器就是其關鍵部位,kernel通過“程序”這個概念來抽象物理的計算資源,同時通過排程演算法的設計來實現對計算資源的高效使用。而對於Spring來說,也是一樣的,一方面通過IoC容器來進行POJO物件管理,以及對他們進行鬆耦合處理,同時也讓資訊資源可以用最簡單的Java語言來抽象和描述;另一方面,可以通過Aop來增強服務的功能。


  另外,在Spring體系中,Spring簡化了JavaEE所進行的開發,這種簡化是指我們能夠在不EJB這麼厚重的環境中使用JavaEE的基本服務——為應用開發服務提供了許多即開即用的系統元件合服務,這些服務涵蓋了JavaEE各個基本服務,對於其他的服務,也可以根據使用情況動態擴充套件到Spring體系中。基本來說,Spring體系中已經涵蓋了JavaEE中經常用到的許多服務,比如事務處理、WebMVC、JDBC、ORM、遠端呼叫,這些服務的價值是不可忽視的,就像kernel如果沒有實現許多驅動,那Linux對使用者而言也是沒有任何價值的。Spring通過自己的努力,提供了這些看起來不起眼,但對推廣起著關鍵作用的部分,從而構建起了一個豐富的生態圈。其實,這也是interface21和Spring之間的區別。


  和Linux一樣,作為一個開源專案。其開源的特性也深深影響了Spring體系的設計,在發展的過程中,其自身也吸收了不少好的社群專案,比如Spring的Security框架就是來源於社群Acegi,這個框架的原意是為Spring設計一個安全框架,讓Spring應用更方便地處理一些安全性的問題,但慢慢的被Spring吸收,成為Spring的一個子專案。



相關推薦

spring原始碼解析邁向學習spring

  Spring總共大約有20個模組,由1300多個不同的檔案構成。而這些元件被分別整合在核心容器(CoreContainer)、Aop(AspectOrientedProgramming)和裝置支援(Instrmentation)、資料訪問及整合(DataAccess/Integeration)、Web、報

Spring原始碼解析——元件註冊1

一、@Configuration&@Bean給容器中註冊元件 public class Person { private String name; private Integer age; public Person() { } public

spring原始碼解析

XmlBeanFactory使用了DefaultListableBeanFactory作為基類,DefaultListableBeanFactory是一個很重要的IOC實現類,XmlBeanFactory其實現基本原理和ApplicationContext一樣,

Spring基於註解形式的 AOP的原理流程及原始碼解析

在Spring的配置類上添加註解@EnableAspectJAutoProxy: @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) public class MvcContextCo

Android FM模組學習原始碼解析

  前一章我們瞭解了FM手動調頻,接下來我們要分析FM模組用到的原始碼。此原始碼是基於高通平臺的,別的平臺都大同小異,只不過是平臺自己作了些小改動而已。    首先要看的當然是主activity,

Spring原始碼解析十三——AOP原理——AnnotationAwareAspectJAutoProxyCreator註冊

 * 2、 AnnotationAwareAspectJAutoProxyCreator:  *         AnnotationAwareAspectJAutoProxyCreator &nbs

Spring原始碼解析——元件註冊4

  /** * 給容器中註冊元件; * 1)、包掃描+元件標註註解(@Controller/@Service/@Repository/@Component)[自己寫的類] * 2)、@Bean[匯入的第三方包裡面的元件] * 3)、@Import[快速給容器中匯入一個

Spring原始碼解析——生命週期——BeanPostProcessor在spring底層的使用

一、ApplicationContextAwareProcessor import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import or

Spring原始碼解析——生命週期——BeanPostProcessor

https://blog.csdn.net/u011734144/article/details/72600932 http://www.cnblogs.com/lucas2/p/9430169.html   BeanPostProcessor:bean的後置處理器。在bean

Spring原始碼解析——元件註冊3

@Scope設定元件作用域 import com.ken.domain.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Config

Spring原始碼解析——元件註冊2

    import com.ken.service.BookService; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.

認真的 Netty 原始碼解析

本文又是一篇原始碼分析文章,其實除了 Doug Lea 的併發包原始碼,我是不太愛寫原始碼分析的。 本文將介紹 Netty,Java 平臺上使用最廣泛的 NIO 包,它是對 JDK 中的 NIO 實現的一層封裝,讓我們能更方便地開發 NIO 程式。其實,Netty 不僅僅是 NIO 吧,但是,基本上大家

EventBus原始碼解析—訂閱過程

1.EventBus原始碼解析(一)—訂閱過程 2.EventBus原始碼解析(二)—釋出事件和登出流程 前言 最近發現EventBus用起來是真的方便,本來對於EventBus我對於這個框架的原始碼的閱讀的優先順序是比較低的,因為這個框架不像OkHttp,Gli

Spring原始碼解析:obtainFreshBeanFactory

spring的ApplicationContext容器的初始化流程主要由AbstractApplicationContext類中的refresh方法實現。 而refresh()方法中獲取新工廠的主要是由obtainFreshBeanFactory()實現的,後續的操作均是beanFactoty的進一步處理。

Spring原始碼解析:父子容器的概念

  相信大家現在在使用spring專案開發時可能不只是單單使用spring一個框架進行開發, 可能會用到現在主流的ssm,spring和springmvc一起使用。   而在一起使用的時候我就發現了一個問題,在web.xml配置spring容器初始化的時候存在一個問題。     一般我們在配置sprin

【MapReduce詳解及原始碼解析】——分片輸入、Mapper及Map端Shuffle過程

title: 【MapReduce詳解及原始碼解析(一)】——分片輸入、Mapper及Map端Shuffle過程 date: 2018-12-03 21:12:42 tags: Hadoop categories: 大資料 toc: true 點選檢視我的部落格:Josonlee’

Redis5.0原始碼解析----------簡單動態字串SDS

基於Redis5.0 Redis 沒有直接使用 C 語言傳統的字串表示(以空字元結尾的字元陣列,以下簡稱 C 字串), 而是自己構建了一種名為簡單動態字串(simple dynamic string,SDS)的抽象型別, 並將 SDS 用作 Redis 的預設字串表示。

Spring原始碼解析:SpringMVC原始碼解析

SpringMVC是Spring一個非常重要的模組,從大體上看,在使用SpringMVC的時候,需要在web.xml中配置DispatcherServlet,這個DispatcherServlet可以看成是一個前端控制器的實現,web請求會通過它分發給各個對應的Control

OkHttp原始碼解析

簡單使用 OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); Request request = new Request.Builder() .url("www.bai

OKHttp 3.10原始碼解析:執行緒池和任務佇列

OKhttp是Android端最火熱的網路請求框架之一,它以高效的優點贏得了廣大開發者的喜愛,下面是OKhttp的主要特點: 1.支援HTTPS/HTTP2/WebSocket 2.內部維護執行緒池佇列,提高併發訪問的效率 3.內部維護連線池,支援多路複用,減少連線建立開銷 4.