一、技術體系結構
- 總體技術體系
- 1 單一架構:一個專案,一個工程,匯出為一個war包,在一個Tomcat上執行。也叫all in one。
目前主要應用技術框架為:Spring、SpringMVC、Mybatis
分散式架構:一個專案(對應 IDEA 中的一個 project),拆分成很多個模組,每個模組是一個 IDEA 中的一個 module。每一個工程都是執行在自己的 Tomcat 上。模組之間可以互相呼叫。每一個模組內部可以看成是一個單一架構的應用。
分散式架構主要應用技術框架:SpringBoot(SSM)、SpringCloud、中介軟體等。
1.2框架概念和理解
框架( Framework )是一個整合了基本結構、規範、設計模式、程式語言和程式庫等基礎元件的軟體系統,它可以用來構建更高階別的應用程 序。框架的設計和實現旨在解決特定領域中的常見問題,幫助開發人員更高效、更穩定地實現軟體開發目標。
2. 降低開發成本:框架的提供標準化的程式語言、資料操作等程式碼片段,避免了重複開發的問題,降低了開發成本,提供深度最佳化的系統,降低了維護成本,增強了系統的可靠性。
3. 提高應用程式的穩定性:框架通常經過了很長時間的開發和測試,其中的許多元件、程式碼片段和設計模式都得到了驗證。重複利用這些元件有助於減少bug的出現,從而提高了應用程式的穩定性。
4. 提供標準化的解決方案:框架通常是針對某個特定領域的,透過提供標準化的解決方案,可以為開發人員提供一種共同的語言和思想基礎,有助於更好地溝通和協作。
2. 可能存在侷限性:雖然框架提高了開發效率並可以幫助開發人員解決常見問題,但是在某些情況下,特定的應用需求可能超出框架的範圍,從而導致應用程式無法滿足要求。開發人員可能需要更多的控制權和自由度,同時需要在框架和應用程式之間進行權衡取捨。
3. 版本變更和相容性問題:框架的版本釋出和迭代通常會導致程式碼庫的大規模變更,進而導致應用程式出現相容性問題和漏洞。當框架變更時,需要考慮框架是否向下相容,以及如何進行適當的測試、遷移和升級。
4. 架構風險:框架涉及到很多抽象和概念,如果開發者沒有足夠的理解和掌握其架構,可能會導致系統出現設計和架構缺陷,從而影響系統的健康性和安全性。
總之,框架已經對基礎的程式碼進行了封裝並提供相應的API,開發者在使用框架是直接呼叫封裝好的API可以省去很多程式碼編寫,從而提高工作效率和開發速度。
二、SpringFramework介紹
2.1Spring和SpringFramework概念 https://spring.io/projects
廣義的 Spring:Spring 技術棧(全家桶)
廣義上的 Spring 泛指以 Spring Framework 為基礎的 Spring 技術棧。
經過十多年的發展,Spring 已經不再是一個單純的應用框架,而是逐漸發展成為一個由多個不同子專案(模組)組成的成熟技術,例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子專案的基礎。
這些子專案涵蓋了從企業級應用開發到雲端計算等各方面的內容,能夠幫助開發人員解決軟體發展過程中不斷產生的各種實際問題,給開發人員帶來了更好的開發體 驗。
**狹義的 Spring:Spring Framework**(基礎框架)
狹義的 Spring 特指 Spring Framework,通常我們將它稱為 Spring 框架。
Spring Framework(Spring框架)是一個開源的應用程式框架,由SpringSource公司開發,最初是為了解決企業級開發中各種常見問題而建立的。它提供了很多功 能,例如:依賴注入(Dependency Injection)、面向切面程式設計(AOP)、宣告式事務管理(TX)等。其主要目標是使企業級應用程式的開發變得更加簡單和快 速,並且Spring框架被廣泛應用於Java企業開發領域。
Spring全家桶的其他框架都是以SpringFramework框架為基礎!
2.2 SpringFramework主要功能模組
SpringFramework框架結構圖
功能模組 | 功能介紹 |
---|---|
Core Container | 核心容器,在 Spring 環境下使用任何功能都必須基於 IOC 容器。 |
AOP&Aspects | 面向切面程式設計 |
TX | 宣告式事務管理。 |
Spring MVC | 提供了面向Web應用程式的整合功能。 |
2.3 SpringFramework主要優勢
1. 豐富的生態系統:Spring 生態系統非常豐富,支援許多模組和庫,如 Spring Boot、Spring Security、Spring Cloud 等等,可以幫助開發人員快速構建高可靠性的企業應用程式。
2. 模組化的設計:框架元件之間的鬆散耦合和模組化設計使得 Spring Framework 具有良好的可重用性、可擴充套件性和可維護性。開發人員可以輕鬆地選擇自己需要的模組,根據自己的需求進行開發。
3. 簡化 Java 開發:Spring Framework 簡化了 Java 開發,提供了各種工具和 API,可以降低開發複雜度和學習成本。同時,Spring Framework 支援各種應用場景,包括 Web 應用程式、RESTful API、訊息傳遞、批處理等等。
4. 不斷創新和發展:Spring Framework 開發團隊一直在不斷創新和發展,保持與最新技術的接軌,為開發人員提供更加先進和優秀的工具和框架。
因此,這些優點使得 Spring Framework 成為了一個穩定、可靠、且創新的框架,為企業級 Java 開發提供了一站式的解決方案。
Spring 使建立 Java 企業應用程式變得容易。它提供了在企業環境中採用 Java 語言所需的一切,支援 Groovy 和 Kotlin 作為 JVM 上的替代語言,並且可以根據應用程式的需求靈活地建立多種架構。從Spring Framework 6.0.6開始,Spring 需要 Java 17+。
三、Spring loC容器和核心概念
3.1元件和元件管理概念
3.1.1什麼是元件?
回顧常規的三層架構處理請求流程:
整個專案就是由各種元件搭建而成的:
3.1.2我們的期待是:
- 有人替我們建立元件的物件
- 有人幫我們儲存元件的物件
- 有人幫助我們自動組裝
- 有人替我們管理事務
- 有人協助我們整合其他框架
3.1.3 Spring充當元件管理角色(IoC)
元件可以完全交給Spring 框架進行管理,Spring框架替代了程式設計師原有的new物件和物件屬性賦值動作等!
Spring具體的元件管理動作包含:
- 元件物件例項化
- 元件屬性屬性賦值
- 元件物件之間引用
- 元件物件存活週期管理
- ......
我們只需要編寫後設資料(配置檔案)告知Spring 管理哪些類元件和他們的關係即可!
注意:元件是對映到應用程式中所有可重用元件的Java物件,應該是可複用的功能物件!
- 元件一定是物件
- 物件不一定是元件
綜上所述,Spring 充當一個元件容器,建立、管理、儲存元件,減少了我們的編碼壓力,讓我們更加專注進行業務編寫!
3.1.4 元件交給Spring的管理的優勢
1. 降低了元件之間的耦合性:Spring IoC容器透過依賴注入機制,將元件之間的依賴關係削弱,減少了程式元件之間的耦合性,使得元件更加鬆散地耦合。
2. 提高了程式碼的可重用性和可維護性:將元件的例項化過程、依賴關係的管理等功能交給Spring IoC容器處理,使得元件程式碼更加模組化、可重用、更易於維護。
3. 方便了配置和管理:Spring IoC容器透過XML檔案或者註解,輕鬆的對元件進行配置和管理,使得元件的切換、替換等操作更加的方便和快捷。
4. 交給Spring管理的物件(元件),方可享受Spring框架的其他功能(AOP,宣告事務管理)等
3.2 Spring IoC容器和容器實現
3.2.1普通和複雜容器
普通容器:陣列;List;Set
程式中的複雜容器:
Servlet 容器能夠管理 Servlet(init,service,destroy)、Filter、Listener 這樣的元件的一生,所以它是一個複雜容器。
名稱 | 時機 | 次數 |
---|---|---|
建立物件 | 預設情況:接收到第一次請求 修改啟動順序後:Web應用啟動過程中 | 一次 |
初始化操作 | 建立物件之後 | 一次 |
處理請求 | 接收到請求 | 多次 |
銷燬操作 | Web應用解除安裝之前 | 一次 |
SpringIoC 容器也是一個複雜容器。不僅要負責建立元件的物件、儲存元件的物件,還要負責呼叫元件的方法讓它們工作,最終在特定情況下銷燬元件。
總結:Spring管理元件的容器,就是一個複雜容器,不僅儲存元件,也可以管理元件之間依賴關係,並且建立和銷燬元件等!
3.2.2 SpringIoC容器介紹
Spring IoC 容器,負責例項化、配置和組裝 bean(元件)。容器透過讀取配置後設資料來獲取有關要例項化、配置和組裝元件的指令。配置後設資料以 XML、Java 註解或 Java 程式碼形式表現。它允許表達組成應用程式的元件以及這些元件之間豐富的相互依賴關係。
3.2.3 SpringIoC容器具體介面和實現類
SpringIoc容器介面:
BeanFactory 介面提供了一種高階配置機制,能夠管理任何型別的物件,它是SpringIoC容器標準化超介面!
`ApplicationContext` 是 `BeanFactory` 的子介面。它擴充套件了以下功能:
- 更容易與 Spring 的 AOP 功能整合
- 訊息資源處理(用於國際化)
- 特定於應用程式給予此介面實現,例如Web 應用程式的 `WebApplicationContext`
簡而言之, BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 新增了更多特定於企業的功能。 ApplicationContext 是 BeanFactory 的完整超集!
型別名 | 簡介 |
---|---|
ClassPathXmlApplicationContext | 透過讀取類路徑下的 XML 格式的配置檔案建立 IOC 容器物件 |
FileSystemXmlApplicationContext | 透過檔案系統路徑讀取 XML 格式的配置檔案建立 IOC 容器物件 |
AnnotationConfigApplicationContext | 透過讀取Java配置類建立 IOC 容器物件 |
WebApplicationContext | 專門為 Web 應用準備,基於 Web 環境建立 IOC 容器物件,並將物件引入存入 ServletContext 域中。 |
3.2.4 SpringIoC容器管理配置關係
Spring IoC 容器使用多種形式的配置後設資料。此配置後設資料表示您作為應用程式開發人員如何告訴 Spring 容器例項化、配置和組裝應用程式中的物件。
Spring框架提供了多種配置方式:XML配置方式、註解方式和Java配置類方式
1. XML配置方式:是Spring框架最早的配置方式之一,透過在XML檔案中定義Bean及其依賴關係、Bean的作用域等資訊,讓Spring IoC容器來管理Bean之間的依賴關係。該方式從Spring框架的第一版開始提供支援。
2. 註解方式:從Spring 2.5版本開始提供支援,可以透過在Bean類上使用註解來代替XML配置檔案中的配置資訊。透過在Bean類上加上相應的註解(如@Component, @Service, @Autowired等),將Bean註冊到Spring IoC容器中,這樣Spring IoC容器就可以管理這些Bean之間的依賴關係。
3. **Java配置類**方式:從Spring 3.0版本開始提供支援,透過Java類來定義Bean、Bean之間的依賴關係和配置資訊,從而代替XML配置檔案的方式。Java配置類是一種使用Java編寫配置資訊的方式,透過@Configuration、@Bean等註解來實現Bean和依賴關係的配置。
了迎合當下開發環境,我們將以配置類+註解方式為主進行講解!
3.3 Spring IoC / DI 概念總結
IOC容器:Spring IoC 容器,負責例項化、配置和組裝 bean(元件)核心容器。容器透過讀取配置後設資料來獲取有關要例項化、配置和組裝元件的指令。
IoC(Inversion of Control)控制反轉:Spring IoC 容器,負責例項化、配置和組裝 bean(元件)核心容器。容器透過讀取配置後設資料來獲取有關要例項化、配置和組裝元件的指令。
DI(Dependency Inject)依賴注入:DI 是指在元件之間傳遞依賴關係的過程中,將依賴關係在容器內部進行處理,這樣就不必在應用程式程式碼中硬編碼物件之間的依賴關係,實現了物件之間的解耦合。在 Spring 中,DI 是透過 XML 配置檔案或註解的方式實現的。它提供了三種形式的依賴注入:建構函式注入、Setter 方法注入和介面注入。
四、Spring IoC實踐和使用
4.1 Spring IoC /DI 實現步驟
1。編寫後設資料(配置)
配置後設資料,既是編寫交給SpringIoC容器管理元件的資訊,配置方式有三種。
基於 XML 的配置後設資料的基本結構:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 此處要新增一些約束,配置檔案的標籤並不是隨意命名 --> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 https://www.springframework.org/schema/beans/spring-beans.xsd"> 7 8 <bean id="..." [1] class="..." [2]> 9 <!-- collaborators and configuration for this bean go here --> 10 </bean> 11 12 <bean id="..." class="..."> 13 <!-- collaborators and configuration for this bean go here --> 14 </bean> 15 <!-- more bean definitions go here --> 16 </beans>
Spring IoC 容器管理一個或多個元件。這些 元件是使用你提供給容器的配置後設資料(例如,以 XML `<bean/>` 定義的形式)建立的。
<bean /> 標籤 == 元件資訊宣告
- `id` 屬性是標識單個 Bean 定義的字串。
- `class` 屬性定義 Bean 的型別並使用完全限定的類名。
2.例項化IoC容器
//例項化ioc容器,讀取外部配置檔案,最終會在容器內進行ioc和di動作 ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
3.獲取Bean(元件)
ApplicationContext 是一個高階工廠的介面,能夠維護不同 bean 及其依賴項的登錄檔。透過使用方法 T getBean(String name, Class requiredType) ,您可以檢索 bean 的例項。
1 //建立ioc容器物件,指定配置檔案,ioc也開始例項元件物件 2 ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml"); 3 //獲取ioc容器的元件物件 4 PetStoreService service = context.getBean("petStore", PetStoreService.class); 5 //使用元件物件 6 List<String> userList = service.getUsernameList();
4.2基於XML配置方式元件管理
4.2.1實驗一:元件(Bean)資訊申明配置(IoC)
1.目標:Spring IoC 容器管理一個或多個 bean。這些 Bean 是使用您提供給容器的配置後設資料建立的(例如,以 XML 定義的形式)
我們學習,如何透過定義XML配置檔案,宣告元件類資訊,交給 Spring 的 IoC 容器進行元件管理!
4.2.2 實驗二:元件(Bean)依賴注入配置(DI)
1.目標:
透過配置檔案,實現IOC容器中Bean之間的引用(依賴注入DI配置) 主要涉及注入場景:基於建構函式的依賴注入和基於Setter的依賴注入