Java開發學習(一)----初識Spring及其核心概念

一、 Spring系統架構

1.1 系統架構圖

  • Spring Framework是Spring生態圈中最基礎的項目,是其他項目的根基。

  • Spring Framework的發展也經歷了很多版本的變更,每個版本都有相應的調整

  • Spring Framework的5版本目前沒有最新的架構圖,而最新的是4版本,所以接下來主要研究的是4的架構圖

    (1)核心層

    • Core Container:核心容器,這個模組是Spring最核心的模組,其他的都需要依賴該模組

    (2)AOP層

    • AOP:面向切面編程,它依賴核心層容器,目的是在不改變原有程式碼的前提下對其進行功能增強

    • Aspects:AOP是思想,Aspects是對AOP思想的具體實現

    (3)數據層

    • Data Access:數據訪問,Spring全家桶中有對數據訪問的具體實現技術

    • Data Integration:數據集成,Spring支援整合其他的數據層解決方案,比如Mybatis

    • Transactions:事務,Spring中事務管理是Spring AOP的一個具體實現

    (4)Web層

    • 具體體現在SpringMVC框架

    (5)Test層

    • Spring主要整合了Junit來完成單元測試和集成測試

二、Spring核心概念

在Spring核心概念這部分內容中主要包含IOC/DI、IOC容器和Bean,那麼問題就來了,這些都是什麼呢?

2.1 目前項目中的問題

要想解答這個問題,就需要先分析下目前咱們程式碼在編寫過程中遇到的問題:

(1)業務層需要調用數據層的方法,就需要在業務層new數據層的對象

(2)如果數據層的實現類發生變化,那麼業務層的程式碼也需要跟著改變,發生變更後,都需要進行編譯打包和重部署

(3)所以,現在程式碼在編寫的過程中存在的問題是:耦合度偏高

針對這個問題,該如何解決呢?

我們就想,如果能把框中的內容給去掉,不就可以降低依賴了么,但是又會引入新的問題,去掉以後程式能運行么?

答案肯定是不行,因為bookDao沒有賦值為Null,強行運行就會出空指針(NPE)異常。

所以現在的問題就是,業務層不想new對象,運行的時候又需要這個對象,該咋辦呢?

針對這個問題,Spring就提出了一個解決方案:

  • 使用對象時,在程式中不要主動使用new產生對象,轉換為由外部提供對象。這種實現思就是Spring的一個核心概念(IOC)

2.2 IOC、IOC容器、Bean、DI

  1. IOC(Inversion of Control)控制反轉

(1)什麼是控制反轉呢?

  • 使用對象時,由主動new產生對象轉換為由外部提供對象,此過程中對象創建控制權由程式轉移到外部,此思想稱為控制反轉。

    • 業務層要用數據層的類對象,以前是自己new的

    • 現在自己不new了,交給別人[外部]來創建對象

    • 別人[外部]就反轉控制了數據層對象的創建權

    • 這種思想就是控制反轉

    • 別人[外部]指定是什麼呢?

(2)Spring和IOC之間的關係是什麼呢?

  • Spring技術對IOC思想進行了實現

  • Spring提供了一個容器,稱為IOC容器,用來充當IOC思想中的"外部"

  • IOC思想中的別人[外部]指的就是Spring的IOC容器

(3)IOC容器的作用以及內部存放的是什麼?

  • IOC容器負責對象的創建、初始化等一系列工作,其中包含了數據層和業務層的類對象

  • 被創建或被管理的對象在IOC容器中統稱為Bean

  • IOC容器中放的就是一個個的Bean對象

(4)當IOC容器中創建好service和dao對象後,程式能正確執行么?

  • 不行,因為service運行需要依賴dao對象

  • IOC容器中雖然有service和dao對象

  • 但是service對象和dao對象沒有任何關係

  • 需要把dao對象交給service,也就是說要綁定service和dao對象之間的關係

像這種在容器中建立對象與對象之間的綁定關係就要用到DI:

  1. DI(Dependency Injection)依賴注入

(1)什麼是依賴注入呢?

  • 在容器中建立bean與bean之間的依賴關係的整個過程,稱為依賴注入

    • 業務層要用數據層的類對象,以前是自己new的

    • 現在自己不new了,靠別人[外部其實指的就是IOC容器]來給注入進來

    • 這種思想就是依賴注入

(2)IOC容器中哪些bean之間要建立依賴關係呢?

  • 這個需要程式設計師根據業務需求提前建立好關係,如業務層需要依賴數據層,service就要和dao建立依賴關係

介紹完Spring的IOC和DI的概念後,我們會發現這兩個概念的最終目標就是:充分解耦,具體實現靠:

  • 使用IOC容器管理bean(IOC)

  • 在IOC容器內將有依賴關係的bean進行關係綁定(DI)

  • 最終結果為:使用對象時不僅可以直接從IOC容器中獲取,並且獲取到的bean已經綁定了所有的依賴關係.

2.3 核心概念小結

(1)什麼IOC/DI思想?

  • IOC:控制反轉,控制反轉的是對象的創建權

  • DI:依賴注入,綁定對象與對象之間的依賴關係

(2)什麼是IOC容器?:Spring創建了一個容器用來存放所創建的對象,這個容器就叫IOC容器

(3)什麼是Bean?:容器中所存放的一個個對象就叫Bean或Bean對象