1. 程式人生 > >Spring學習筆記(2)----------設計理念

Spring學習筆記(2)----------設計理念

我們知道Bean包裝的是Object,而Object必然有資料,如何給這些資料提供生存環境就是Context要解決的問題,對Context來說他就是要發現每個Bean之間的關係,為它們建立這種關係並且要維護好 這種關係。所以Context就是一個Bean關係的集合,這個關係集合又叫Ioc容器,一旦建立起這個Ioc容器後Spring就可以為你工作了。那Core元件又有什麼用武之地呢?其實Core就是發現、建立和維護每 個Bean之間的關係所需要的一些列的工具,從這個角度看來,Core這個元件叫Util更能讓你理解。

它們之間可以用下圖來表示:

三個元件關係
圖2.三個元件關係

核心元件詳解

這裡將詳細介紹每個元件內部類的層次關係,以及它們在執行時的時序順序。我們在使用Spring是應該注意的地方。

Bean元件

前面已經說明了Bean元件對Spring的重要性,下面看看Bean這個元件式怎麼設計的。Bean元件在Spring的org.springframework.beans包下。這個包下的所有類主要解決了三件事:Bean的定義、Bean 的建立以及對Bean的解析。對Spring的使用者來說唯一需要關心的就是Bean的建立,其他兩個由Spring在內部幫你完成了,對你來說是透明的。

SpringBean的建立時典型的工廠模式,他的頂級介面是BeanFactory,下圖是這個工廠的繼承層次關係:

Bean工廠的繼承關係 
圖4.Bean工廠的繼承關係

BeanFactory有三個子類:ListableBeanFactory、HierarchicalBeanFactory和Autowire Capable Bean Factory。但是從上圖中我們可以發現最終的預設實現類是DefaultListableBeanFactory,他實 現了所有的介面。那為何要定義這麼多層次的介面呢?查閱這些介面的原始碼和說明發現,每個介面都有他使用的場合,它主要是為了區分在Spring內部在操作過程中物件的傳遞和轉化過程中,對物件的 資料訪問所做的限制。例如ListableBeanFactory介面表示這些Bean是可列表的,而HierarchicalBeanFactory表示的是這些Bean是有繼承關係的,也就是每個Bean有可能有父Bean。 AutowireCapableBeanFactory介面定義Bean的自動裝配規則。這四個介面共同定義了Bean的集合、Bean之間的關係、以及Bean行為。

Bean的定義主要有BeanDefinition描述,如下圖說明了這些類的層次關係:

Bean定義的類層次關係圖
圖5.Bean定義的類層次關係圖

Bean的定義就是完整的描述了在Spring的配置檔案中你定義的節點中所有的資訊,包括各種子節點。當Spring成功解析你定義的一個節點後,在Spring的內部他就被轉化 成BeanDefinition物件。以後所有的操作都是對這個物件完成的。

Bean的解析過程非常複雜,功能被分的很細,因為這裡需要被擴充套件的地方很多,必須保證有足夠的靈活性,以應對可能的變化。Bean的解析主要就是對Spring配置檔案的解析。這個解析過程主要通過 下圖中的類完成:

Bean的解析類
圖6.Bean的解析類

當然還有具體對tag的解析這裡並沒有列出。

Context元件

Context在Spring的org.springframework.context包下,前面已經講解了Context元件在Spring中的作用,他實際上就是給Spring提供一個執行時的環境,用以儲存各個物件的狀態。下面看一下這個 環境是如何構建的。

ApplicationContext是Context的頂級父類,他除了能標識一個應用環境的基本資訊外,他還繼承了五個介面,這五個介面主要是擴充套件了Context的功能。下面是Context的類結構圖:

Context相關的類結構圖
圖7.Context相關的類結構圖

從上圖中可以看出ApplicationContext繼承了BeanFactory,這也說明了Spring容器中執行的主體物件是Bean,另外ApplicationContext繼承了ResourceLoader介面,使得ApplicationContext可以訪 問到任何外部資源,這將在Core中詳細說明。

ApplicationContext的子類主要包含兩個方面:

ConfigurableApplicationContext表示該Context是可修改的,也就是在構建Context中使用者可以動態新增或修改已有的配置資訊,它下面又有多個子類,其中最經常使用的是可更新的Context,即 AbstractRefreshableApplicationContext類。

WebApplicationContext顧名思義,就是為web準備的Context他可以直接訪問到ServletContext,通常情況下,這個介面使用的少。

再往下分就是按照構建Context的檔案型別,接著就是訪問Context的方式。這樣一級一級構成了完整的Context等級層次。

總體來說ApplicationContext必須要完成以下幾件事:

◆標識一個應用環境

◆利用BeanFactory建立Bean物件

◆儲存物件關係表

◆能夠捕獲各種事件

Context作為Spring的Ioc容器,基本上整合了Spring的大部分功能,或者說是大部分功能的基礎。

Core元件

Core元件作為Spring的核心元件,他其中包含了很多的關鍵類,其中一個重要組成部分就是定義了資源的訪問方式。這種把所有資源都抽象成一個介面的方式很值得在以後的設計中拿來學習。下面就 重要看一下這個部分在Spring的作用。

下圖是Resource相關的類結構圖:

Resource相關的類結構圖
圖8.Resource相關的類結構圖

從上圖可以看出Resource介面封裝了各種可能的資源型別,也就是對使用者來說遮蔽了檔案型別的不同。對資源的提供者來說,如何把資源包裝起來交給其他人用這也是一個問題,我們看到Resource 介面繼承了InputStreamSource介面,這個介面中有個getInputStream方法,返回的是InputStream類。這樣所有的資源都被可以通過InputStream這個類來獲取,所以也遮蔽了資源的提供者。另外還有一 個問題就是載入資源的問題,也就是資源的載入者要統一,從上圖中可以看出這個任務是由ResourceLoader介面完成,他遮蔽了所有的資源載入者的差異,只需要實現這個介面就可以載入所有的資源, 他的預設實現是DefaultResourceLoader。

下面看一下Context和Resource是如何建立關係的?首先看一下他們的類關係圖:

Context和Resource的類關係圖
圖9.Context和Resource的類關係圖

從上圖可以看出,Context是把資源的載入、解析和描述工作委託給了ResourcePatternResolver類來完成,他相當於一個接頭人,他把資源的載入、解析和資源的定義整合在一起便於其他元件使用。 Core元件中還有很多類似的方式。

相關推薦

Spring學習筆記2----------設計理念

我們知道Bean包裝的是Object,而Object必然有資料,如何給這些資料提供生存環境就是Context要解決的問題,對Context來說他就是要發現每個Bean之間的關係,為它們建立這種關係並且要維護好 這種關係。所以Context就是一個Bean關係的集合,這個關係集

來換項目系列Spring學習筆記2

servlet span on() 購物車 集成 因此 proxy center str 3.1.1 配置profile bean 使用@profile 註解 例如 @Configuration @Profile("dev") public class xxxConfig{

spring分散式事務學習筆記2

此文已由作者夏昀授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 Model類如下:package com.xy.model 1 package com.xy.model;  2   3 /**  

spring cloud學習筆記2-- Eureka

傳統單體架構介紹及優缺點 一個專案包(war包,歸檔包)包含了應用的所有功能, 在沒有出現微服務概念之前,基本上都是這種架構形式存在, 我們一般把程式打包成一個檔案後,扔到tomcat或者jetty, jboss等應用伺服器中即可 特點: 部署很簡單,符合我們的思維;專案

spring boot 學習筆記 2 Spring Boot 依賴環境和專案結構介紹

使用 Spring Boot 開發專案需要有兩個基礎環境和一個開發工具,這兩個環境是指 Java 編譯環境和構建工具環境,一個開發工具是指 IDE 開發工具。 Spring Boot 2.0 要求 Java 8 作為最低版本,需要在本機安裝 JDK 1.8 並進行環境變數配置,同時需要安裝構建工

作業系統精髓與設計原理(原書第6版)——學習筆記2

 1.3.1 取指令和執行指令 指令暫存器(InstructionRegister,IR)放置取到的指令。指令中包含確定處理器要執行的操作位,處理器解釋指令並執行對應的操作。大體上,這些操作可

[Spring]Spring AOP學習筆記2---5種切入方式、AOP優先順序及切面表示式的重用

Spring AOP學習筆記(2)---5種切入方式、AOP優先順序及切面表示式的重用 一、5種切入方式 學習了下Spring的AOP的五種切入方式,分別是: (1)Before ---在所攔截方法執行前執行; (2)After ---在所攔截方法執行後執行; (3)Aft

Spring框架學習筆記2——面向切面程式設計AOP

介紹 概念 面向切面程式設計AOP與面向物件程式設計OOP有所不同,AOP不是對OOP的替換,而是對OOP的一種補充,AOP增強了OOP。 假設我們有幾個業務程式碼,都呼叫了某個方法,按照OOP的思想,我們就會將此方法封裝在一個類中,之後通過物件.方法名呼叫 我們可以看作我們的業務程式碼被其他程式碼入侵或者是

學習筆記2---Matlab 圖像處理相關函數命令大全

緩沖 操作 .... 命令 tor ace trac cati msh Matlab 圖像處理相關函數命令大全 一、通用函數: colorbar 顯示彩色條 語法:colorbar \ colorbar(‘vert‘) \ colorbar(‘horiz‘) \ co

5.27:cocos2d-x初探學習筆記2--重要概念及Test樣例結構(轉)

這樣的 發生 菜單 add css 基礎 dsm 人的 添加 1.幾個重要概念 在cocos2d引擎中,有幾個概念,各自是導演。場景,布景和人物角色。 導演(CCDirector):在cocos2d-x引擎中,導演類是遊戲的組織者和領導者。導演制定規則讓遊戲內的場

WPF學習筆記2——動畫效果按鈕變長

anim aud tor col log 筆記 wpf style 分享 說明(2017-6-12 11:26:48): 1. 視頻教程裏是把一個按鈕點擊一下,慢慢變長: 註意幾個方面: (1)RoutedEvent="Button.Click",這裏面要用Button,是

bootstrap 學習筆記2---- 排版

-i 排列 分段函數 class 總結 capital src 設置 per 安裝和柵格系統學完,這篇寫的是排版手冊中排版的目錄如下圖 《標題,頁面主題,內聯文本元素,對齊,改變大小寫,縮略語,地址,引用,列表》手冊中介紹那麽多,其實並不是所有的都要去看看。很多都是沒有必

Spring學習筆記

分布式 ransac 解析 工具 files 分布 工廠 根據 使用 Spring學習筆記(一) 因為最近在看《Spring 技術內幕-深入解析Spring 架構與設計原理》,相當於做了個筆記,以及把自己理解的東西記錄下來。 Spring整體架構圖 1.Spring子項目

設計模式學習筆記 設計基本原則之【單一職責原則】

code 分享 開發者 實際應用 需要 ret ext file類 tor 單一職責原則(SRP: Single Responsibility Principle) 名詞解釋: 1) 職責:是指類變化的原因。 2) 職責擴散:就是因為某種原因,職責P被分化為粒度更細的職責P

Spring 學習筆記—— Bean之間的關系、作用域、自動裝配

mar byname pps etc 有時 sysman 對象實例 構造 encoding 繼承   Spring提供了配置信息的繼承機制,可以通過為<bean>元素指定parent值重用已有的<bean>元素的配置信息。 <?xml

Spring 學習筆記—— 切入點表達式

service string 出現 targe || 參數 public 例如 語法   為了能夠靈活定義切入點位置,Spring AOP提供了多種切入點指示符。 execution———用來匹配執行方法的連接點   

spring學習筆記3——bean配置細節註意

collect 1.5 之前 ice ble person name return 引用 1. 一個bean引用另外一個bean 當Person類中有一個屬性是Car,那麽該如何配置呢 person: package com.zj.spring; public class

jQuery源碼學習筆記2

dom src asc turn rdo dom節點 defer ++ des 我們會認識到jQuery中一個叫做domManip的函數,這個函數的作用主要是處理DOM相關的操作,讓傳入的參數更加“幹凈”。 為什麽需要用這個domManip函數呢? 我們知道節點操作瀏覽

後盾網-CI框架實例教程-馬振宇 - 學習筆記2

welcom index 如何 ech lin bsp 後臺模板 back href 第三節視頻:   1、配置自動加載輔助函數URL:     在application/config/autoload.php中設置:       $autoload[‘helper‘] =

linux學習筆記2

linux配置IP進入操作系統界面後,輸入root用戶密碼。<[email protected] ~># root為用戶localhost為主機名(可修改)root用戶後跟的是# 其他用戶為$===============================================