Sping基礎篇----掌握Sping的控制反轉/依賴注入的概念【實戰案例總結】

在這里插入圖片描述

作為一名對技術充滿熱情的學習者,我一直以來都深刻地體會到知識的廣度和深度。在這個不斷演變的數字時代,我遠非專家,而是一位不斷追求進步的旅行者。通過這篇博客,我想分享我在某個領域的學習經驗,與大家共同探討、共同成長。請大家以開放的心態閱讀,相信你們也會在這段知識之旅中找到啟示。

文章目錄

  • 前言
  • 一、什么是Spring?
  • 二、控制反轉(IoC)和依賴注入(DI)
  • 三、依賴注入的實現方式有哪些?
  • 四、Spring核心容器
  • 五、實戰案例


前言

本節我們來學習Sping是什么樣的一個框架,介紹Spring框架支持包和相關文件的獲取方式,并介紹其目錄結構,學習這些知識是為使用Spring框架打好基礎.


一、什么是Spring?

Java Spring,通常指的是Spring Framework,這是一個開放源代碼的Java平臺,廣泛用于創建各種Java應用程序,尤其是企業級應用程序。Spring Framework是一個輕量級的控制反轉(IoC)和面向切面的容器框架。

Spring Framework旨在簡化Java開發,特別是通過以下方面:

  1. 依賴注入(DI):它允許你通過依賴注入的方式減少組件之間的耦合,組件不需要自己尋找或創建它們依賴的其他組件,而是由Spring容器注入所需要的組件。

  2. 面向切面編程(AOP):支持面向切面編程,可以將如安全、事務和日志等橫切關注點與業務邏輯分離,提高代碼的可維護性和可重用性。

  3. 抽象和事務管理:Spring提供了一整套事務管理接口,可以讓你透明地進行聲明式事務管理。

  4. MVC框架:Spring自帶了一個MVC框架,用于創建Web應用程序。它是分層架構的并且集成了多種技術,如JSP、Freemarker、Velocity等。

  5. 各種輔助支持:Spring Framework提供了對JDBC、JPA、JMS、郵件發送等各種企業服務的抽象,這樣開發者可以更容易地整合和使用這些技術。

總之,Spring Framework為Java開發者提供了一個全面的編程和配置模型,大大簡化了Java應用的開發、部署和管理過程。此框架因其靈活性、強大的社區支持和不斷的迭代更新而受到開發者的喜愛。隨著時間的推移,Spring已經發展成一個全面的生態系統,包括Spring Boot、Spring Cloud等多個項目,都是為更快捷、更簡單地開發分布式系統而設計的。

二、控制反轉(IoC)和依賴注入(DI)

控制反轉(IoC)和依賴注入(DI)是編程中用于實現解耦合(decoupling)的兩個重要概念,它們通常在Spring Framework中得到廣泛應用。

控制反轉(IoC) 是一種設計原則,在這種設計中,對象的控制權從程序代碼轉移給一個容器或框架。傳統的程序設計中,組件間的依賴關系通常由組件自己在內部控制和管理。而在IoC下,這種依賴關系的建立由外部容器控制。這意味著程序中的對象不需要自己創建或管理它們的依賴關系,這些都由IoC容器來處理。控制反轉使得代碼的管理更加容易,也使得應用程序更加模塊化。

IoC可以通過多種方式實現,依賴注入只是實現IoC的手段之一。

依賴注入(DI) 是實現IoC的一種技術。DI的核心理念是,一個對象不應該負責創建或查找它依賴的對象。相反,這些依賴應當由外部通過某種方式提供給對象(即“注入”),常見的注入方式有構造器注入、設值器注入(setter injection)或接口注入。

依賴注入的好處包括但不限于:

  1. 降低耦合度:組件之間不直接創建彼此的實例,減少了耦合度,使得代碼更容易修改和擴展。
  2. 增強模塊化:每個組件都可以獨立于其他組件被開發和測試。
  3. 提高測試性:依賴注入使得單元測試更易于執行,因為可以輕松地為一個組件注入測試期間所需的特定依賴。

在Spring框架中,IoC容器負責實例化、配置和組裝對象,依賴注入是Spring實現這些任務的方式。Spring提供了基于XML配置文件和基于注解的兩種主要的DI實現方式。通過使用Spring IoC容器,開發者可以更專注于業務邏輯的實現,而將對象生命周期管理和依賴關系的維護交給框架來處理。

三、依賴注入的實現方式有哪些?

依賴注入(Dependency Injection,簡稱DI)可以通過幾種不同的方式實現。在Spring框架中,主要的實現方式包括:

  1. 構造器注入(Constructor Injection)
    在這種方式中,依賴項作為參數傳遞給構造器。當創建一個類的新實例時,Spring IoC容器調用包含依賴項的構造器,將所需的依賴項注入到類中。

    public class ExampleService {private final Dependency dependency;public ExampleService(Dependency dependency) {this.dependency = dependency;}
    }
    
  2. 設值器注入(Setter Injection)
    該方式通過類的設值器方法(setter methods)注入依賴項。這允許依賴項在對象被構造之后、被使用之前的任意時間點被注入。

    public class ExampleService {private Dependency dependency;public void setDependency(Dependency dependency) {this.dependency = dependency;}
    }
    
  3. 字段注入(Field Injection)
    通過在類的字段上直接設置依賴項來實現依賴注入。Spring框架通過反射機制來實現這一點,通常與@Autowired注解一同使用。

    public class ExampleService {@Autowiredprivate Dependency dependency;
    }
    
  4. 方法注入(Method Injection)
    類似setter注入,但它可以是任何方法,而不僅僅是傳統的setter方法。在某個方法的參數中聲明依賴項,讓Spring調用該方法并傳入必要的參數。

    public class ExampleService {private Dependency dependency;@Autowiredpublic void prepare(Dependency dependency) {this.dependency = dependency;}
    }
    
  5. 查找方法注入(Lookup Method Injection)
    這是一種特殊情況,主要用于當我們需要在單例bean中注入一個原型bean時。

  6. 接口注入(Interface Injection)
    這是一種更少見的依賴注入方式,其中一個組件(如一個類)提供一個接口,該接口用來注入依賴。

構造器注入和設值器(setter)注入是最為常見的依賴注入方式。構造器注入是更加不可變和避免了“部分構建”的對象,而設值器注入允許更多的靈活性,如可選和更改的依賴。字段注入簡單但不推薦用于關鍵業務邏輯,因為它可能導致難以跟蹤的依賴和困難的單元測試編寫。考慮到這些約束,在選擇注入方法時,應當根據具體情況和需求進行決策。

四、Spring核心容器

Spring 核心容器是Spring框架的基礎部分,它提供了用于構建整個框架的基本功能。核心容器由幾個主要的組建構成,主要負責管理對象(稱為Bean)的生命周期和依賴注入。

Spring核心容器主要由以下四個模塊組成:

  1. Spring Core(核心容器):這是框架的基礎部分,提供了控制反轉(IoC)和依賴注入(DI)的特性。在這里,BeanFactory是最主要的接口,它是一個先進的配置機制,能夠管理任意類型的對象。

  2. Spring Context(應用上下文):它建立在Spring Core基礎之上,能夠訪問Spring的核心功能。ApplicationContext接口是Context模塊的焦點。它提供了比BeanFactory更豐富的功能,是BeanFactory的一個超集,能夠支持國際化、事件傳播、資源加載以及透明的創建上下文(如Web應用程序環境)。

  3. Spring AOP(面向切面編程):該模塊提供了面向切面編程的實現,允許定義方法攔截和切點,從而實現解耦功能。這可以用來實現如事務管理和日志等跨越多個點的橫切關注點。

  4. Spring Expression Language(SpEL):SpEL是一種強大的表達式語言,它支持在運行時查詢和操作對象圖。它可以用來動態查詢對象圖的狀態或在對象圖中進行配置。

Spring核心容器不僅負責IoC和DI,也提供了各種企業級應用服務的支持。利用核心容器,開發者可以定義對象的創建方式、裝配它們的線索、配置它們的生命周期,以及管理它們的整個生命周期。

在核心容器之上,Spring框架還包括了數據訪問/集成、Web、消息傳遞以及其他模塊,這些模塊構成了Spring的全面編程和配置模型。

五、實戰案例

假設我們要創建一個簡單的在線圖書商店應用程序,我們將使用Spring框架來展示控制反轉(IoC),依賴注入(DI),以及如何通過Spring核心容器來組織應用程序組件。

項目需求簡述:

  • 用戶能夠瀏覽圖書。
  • 用戶可以將圖書添加到購物車。
  • 用戶可以進行結算。

實施步驟和概念應用:

  1. 設置工程環境:

    • 創建Maven或Gradle項目,并在項目的pom.xmlbuild.gradle文件中添加Spring相關依賴。
  2. 定義實體與組件(IoC and DI):

    • 創建圖書(Book)、購物車(ShoppingCart)和訂單(Order)實體。
    public class Book {private String title;private String author;private BigDecimal price;// Getters and Setters ...
    }public class ShoppingCart {private List<Book> books = new ArrayList<>();public void addBook(Book book) {books.add(book);}// Getters ...
    }public class Order {private ShoppingCart cart;private Date creationDate;// Constructors, Getters and Setters ...
    }
    
    • 創建服務接口比如BookServiceShoppingCartService,以及OrderService并提供實現。
    public interface BookService {List<Book> findAllBooks();Book findBookById(String id);
    }@Service
    public class BookServiceImpl implements BookService {// Injection of book repository to access books// Implementing methods...
    }@Service
    public class ShoppingCartService {// Methods for cart management...
    }@Service
    public class OrderService {// Methods for order processing...
    }
    
  3. 配置Spring Beans(XML/Annotation-based Configuration):

    • 使用XML文件或注解來配置實體和服務類作為Spring beans。
    @Service
    public class ShoppingCartService {private final ShoppingCart cart;@Autowiredpublic ShoppingCartService(ShoppingCart cart) {this.cart = cart;}// ...
    }
    
  4. 使用Spring MVC構建Web界面:

    • 創建Controller以實現用戶與應用交互,如瀏覽圖書、添加圖書到購物車等功能。
    @Controller
    public class BookController {private final BookService bookService;private final ShoppingCartService cartService;@Autowiredpublic BookController(BookService bookService, ShoppingCartService cartService) {this.bookService = bookService;this.cartService = cartService;}// RequestMapping methods...
    }
    
  5. 配置和啟動Spring ApplicationContext:

    • 根據選擇的配置方式,設置ApplicationContext,可能是通過XML配置文件或通過使用@Configuration注解的Java配置類。
    • 啟動Spring應用程序,ApplicationContext會負責初始化所有的Bean,注入依賴,并處理應用的生命周期。
  6. 應用AOP進行事務管理:

    • 用Spring AOP模塊來聲明式地管理事務,確保當發生錯誤時,系統能夠回滾到穩定狀態。
    @Service
    @Transactional
    public class OrderServiceImpl implements OrderService {// Methods for order service that require transactional context...
    }
    

通過這個案例,我們展示了使用Spring框架可以將應用切分為不同的組件和服務,通過IoC和DI簡化組件間的依賴和互操作。Spring的核心容器來管理這些組件的生命周期、依賴關系和配置。同時,利用Spring AOP來處理橫切關注點,如聲明式事務管理。這樣的設計使得應用程序更加模塊化,易于測試和維護。


感謝大家抽出寶貴的時間來閱讀博主的博客,新人博主,感謝大家關注點贊,祝大家未來的學習工作生活一帆風順,加油!!!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696097.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SMMU介紹

SMMU&#xff08;System Memory Management Unit&#xff09;是一種硬件設備&#xff0c;其作用是在虛擬地址空間和物理地址空間之間提供地址轉換的功能。它通常用于處理虛擬化環境中的 I/O 設備&#xff0c;例如虛擬機中的設備訪問或者容器環境中的設備隔離。 SMMU 的主要作用…

KVM虛擬機的克隆方式

話不多說&#xff0c;直接上操作 首先確定我們要克隆的模板機器&#xff0c;這樣可以方便我們后續克隆許多機器 IP獲取最好就是dhcp模式&#xff0c;這樣克隆出來的機器就不需要自己再去改ip了 確定需要克隆的模板機以后&#xff0c;先關機再執行克隆操作 virsh shutdown ser…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目錄 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion&#xff08;own&#xff09;/ Future wo…

Android系統啟動流程

android的啟動流程是從底層開始進行的&#xff0c;具體如下所示&#xff1a; Android是基于Linux內核的系統&#xff0c;Android的啟動過程主要分為兩個階段&#xff0c;首先是Linux內核的啟動&#xff0c;然后是Android框架的啟動。 可以將Andorid系統的啟動流程分為以下五個…

【QT 5 +Linux下軟件桌面快捷方式+qt生成軟件創建桌面圖標+學習他人文章+第二篇:編寫桌面文件.desktop】

【QT 5 Linux下軟件桌面快捷方式qt生成軟件創建桌面圖標學習他人文章第二篇&#xff1a;編寫桌面文件.desktop】 1、前言2、實驗環境3、自我學習總結-本篇總結1、新手的疑問&#xff0c;做這件事目的2、了解.desktop3、三個關鍵目錄以及文件編寫1、目錄&#xff1a;/opt/2、目錄…

【鴻蒙 HarmonyOS 4.0】開發工具安裝

一、準備開發環境 1.1、安裝IDE 鴻蒙應用開發需要使用配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJ IDEA Community&#xff08;IDEA社區版&#xff09;構建&#xff0c;為鴻蒙應用提供了一站式開發環境&#xff0c;集成了開發、運行、調試以及發布應用的…

【leetcode刷題之路】面試經典150題(3)——哈希表+區間

文章目錄 5 哈希表5.1 【哈希表】贖金信5.2 【數學】同構字符串5.3 【數學】單詞規律5.4 【哈希表】有效的字母異位詞5.5 【哈希表】字母異位詞分組5.6 【雙指針】兩數之和5.7 【數學】快樂數5.8 【哈希表】219. 存在重復元素 II5.9 【數學】最長連續序列 6 區間6.1 【數學】匯…

Stable Diffusion 模型分享:AstrAnime(Astr動畫)

本文收錄于《AI繪畫從入門到精通》專欄&#xff0c;專欄總目錄&#xff1a;點這里。 文章目錄 模型介紹生成案例案例一案例二案例三案例四案例五 下載地址 模型介紹 AstrAnime 是一個動漫模型&#xff0c;畫風色彩鮮明&#xff0c;擅長繪制漂亮的小姐姐。 條目內容類型大模型…

fastjson解析自定義get方法導致空指針問題

背景 為了在日志中把出入參打印出來&#xff0c;以便驗證鏈路和排查問題&#xff0c;在日志中將入參用fastjson格式化成字符串輸出&#xff0c;結果遇到了NPE。 問題復現 示例代碼 public static void main(String[] args) {OrganizationId orgId new OrganizationId();N…

規模化強化學習 — 多任務強化學習

1 簡述 1.1 單任務強化學習&#xff08;STRL&#xff09; 在單任務強化學習中&#xff0c;一個無人機的AI系統可能被訓練來執行特定的任務&#xff0c;比如自主導航。在這個任務中&#xff0c;無人機需要學習如何有效地從起點飛行到終點&#xff0c;并避開障礙物。 舉例&#…

【Java多線程】分析線程加鎖導致的死鎖問題以及解決方案

目錄 1、線程加鎖 2、死鎖問題的三種經典場景 2.1、一個線程一把鎖 2.2、兩個線程兩把鎖 2.3、N個線程M把鎖&#xff08;哲學家就餐問題&#xff09; 3、解決死鎖問題 1、線程加鎖 其中 locker 可以是任意對象&#xff0c;進入 synchronized 修飾的代碼塊, 相當于加鎖&…

Java SourceDataLine 播放音頻

Java SourceDataLine 播放音頻 1 依賴2 接口3 實現4 測試 項目Value音頻格式 添加依賴*.wav(JDK 原生支持)*.pcm(JDK 原生支持)*.au(JDK 原生支持)*.aiff(JDK 原生支持)*.mp3mp3spi.jar*.flacjflac-codec.jar 1 依賴 <dependency><groupId>com.googlecode.soundl…

?北郵復試刷題LCR 052. 遞增順序搜索樹__DFS (力扣119經典題變種挑戰)

LCR 052. 遞增順序搜索樹 給你一棵二叉搜索樹&#xff0c;請 按中序遍歷 將其重新排列為一棵遞增順序搜索樹&#xff0c;使樹中最左邊的節點成為樹的根節點&#xff0c;并且每個節點沒有左子節點&#xff0c;只有一個右子節點。 示例 1&#xff1a; 輸入&#xff1a;root [5,…

DataX - 全量數據同步工具

前言 今天是2024-2-21&#xff0c;農歷正月十二&#xff0c;相信今天開始是新的階段&#xff0c;盡管它不是新的周一、某月一日、某年第一天&#xff0c;盡管我是一個很講究儀式感的人。新年剛過去 12 天&#xff0c;再過 3 天就開學咯&#xff0c;開學之后我的大學時光就進入了…

TypeScript01:安裝TypeScript

一、TypeScript 官方網站&#xff1a;https://www.tslang.cn/docs/index.html 練習場&#xff1a;https://www.typescriptlang.org/zh/play 好處&#xff1a; 強類型語言&#xff0c;對JS弱類型的一個良好補充&#xff1b;TS利于大型項目團隊合作&#xff0c;可以一定程度…

這五個軟件測試工具,測試工程師必備

在軟件開發過程中&#xff0c;軟件測試是確保軟件質量和穩定性的關鍵環節。為了幫助開發人員和測試團隊更好地完成這一任務&#xff0c;市面上涌現出眾多軟件測試工具。本文將盤點五個備受推崇的軟件測試工具&#xff0c;它們各具特色&#xff0c;適用于不同的測試場景。 Test…

ChatGPT實戰100例 - (17) 用ChatGPT實現音頻長度測量和音量調整

文章目錄 ChatGPT實戰100例 - (17) 用ChatGPT實現音頻長度測量和音量調整獲取音頻長度pydub獲取音頻長度獲取時長精確到秒格式設定 mutagen獲取音頻長度 調整音量視頻音量調整注意事項 ChatGPT實戰100例 - (17) 用ChatGPT實現音頻長度測量和音量調整 老王媳婦說上次那個pip挺好…

深度學習的學習筆記帖子2

人臉數據集的介紹&#xff1a; https://zhuanlan.zhihu.com/p/362356480 https://blog.csdn.net/bjbz_cxy/article/details/122210641 CASIAWebFace人臉數據集等的github&#xff1a; https://github.com/deepinsight/insightface/blob/master/recognition/datasets/README.md…

藍橋杯基礎知識點9 stack、queue、priority_queue

藍橋杯基礎知識點9 stack、queue、priority_queue 01 stack的定義和結構 stack是一種后進先出&#xff08;LIFO&#xff09;的數據結構&#xff0c;頭文件<stcak>。 template <class T, class Container deque<T>> class stack; T&#xff1a;存儲在stack…

《VitePress 簡易速速上手小冊》第7章 高級功能與動態內容(2024 最新版)

文章目錄 7.1 動態路由與 API 集成7.1.1 基礎知識點解析7.1.2 重點案例&#xff1a;技術博客7.1.3 拓展案例 1&#xff1a;電商網站7.1.4 拓展案例 2&#xff1a;事件管理網站 7.2 狀態管理與 Vuex 使用7.2.1 基礎知識點解析7.2.2 重點案例&#xff1a;用戶認證系統7.2.3 拓展案…