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

|舊市拾荒| 發表於 2022-05-28
Java Spring

一、 Spring系統架構

1.1 系統架構圖

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

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

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

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

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

    (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/DIIOC容器Bean,那麼問題就來了,這些都是什麼呢?

2.1 目前專案中的問題

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

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

(1)業務層需要呼叫資料層的方法,就需要在業務層new資料層的物件

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

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

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

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

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

答案肯定是不行,因為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)依賴注入

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

(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物件