Spring IOC 學習筆記

1. 概述

? ? ? Spring IOC(Inversion of Control,控制反轉)是一種設計思想,通過依賴注入(Dependency Injection,DI)實現。它的核心思想是將對象的創建和依賴關系的管理交給Spring容器,從而降低代碼之間的耦合度,提高代碼的可維護性和可測試性。

2. 代碼示例分析

2.1 傳統方式

在沒有使用Spring之前,對象的創建和依賴關系的管理是由程序自身控制的。例如:

public class UserServiceImpl implements UserService {private UserDao userDao = new UserDaoOracleImpl();public void getUser() {userDao.getUser();}
}

這種方式的缺點是代碼耦合度高,修改和擴展困難。

2.2 使用Set方法注入

通過Set方法實現依賴注入,將對象的創建和依賴關系的管理交給Spring容器

public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void getUser() {userDao.getUser();}
}

這種方式使得程序從主動創建對象轉變為被動接受對象,降低了耦合度

2.3 使用構造函數注入

通過構造函數注入,進一步簡化代碼:

public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}public void getUser() {userDao.getUser();}
}

這種方式更加簡潔,但需要在Spring配置文件中進行相應的配置。

3. Spring配置文件

3.1.Spring IoC容器的工作原理:Spring IoC容器的主要作用是創建、管理和裝配Bean。
3.1.1?讀取配置文件

Spring IoC容器首先讀取配置文件(如applicationContext.xml),文件中定義了Bean的創建和依賴關系。

3.1.2 根據元數據創建和組裝Bean

根據配置文件中的元數據,Spring IoC容器創建相應的Bean,并注入所需的依賴。

3.1.3 從容器中獲取Bean

? ? ? ?最后,應用程序可以從Spring IoC容器中獲取已經創建和配置好的Bean,Spring通過讀取配置文件(如applicationContext.xmlbeans.xml)來創建和管理Bean。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="mysqlImpl" class="com.kuang.dao.UserDaoMysqlImpl"/><bean id="oracleImpl" class="com.kuang.dao.UserDaoOracleImpl"/><bean id="userServiceImpl" class="com.kuang.service.UserServiceImpl"><!-- ref:引用Spring容器中創建好的對象 --><!-- value:具體的值,基本數據類型 --><property name="userDao" ref="mysqlImpl"/></bean>
</beans>

4. 控制反轉(IoC)的本質

? ? ? 控制反轉是一種通過描述(XML或注解)并通過第三方去生產或獲取特定對象的方式。在Spring中,IoC容器負責對象的創建、管理和裝配

4.1 傳統方式與IoC方式的對比
  • 傳統方式:程序主動創建對象,控制權在程序猿手上。

  • IoC方式:程序被動接收對象,控制權在Spring容器手中。

4.2 依賴注入(DI)

? ? ? 依賴注入是實現IoC的一種方法,通過構造函數、Set方法或注解等方式將依賴注入到對象中。

4.3 demo例子

pojo

public class Hello {private String str;public String getStr() {return str;}public void setStr(String str) {this.str = str;}@Overridepublic String toString() {return "Hello{" +"str='" + str + '\'' +'}';}
}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.WPS.pojo.Hello"><property name="str" value="Wupeisheng" /></bean></beans>

測試

/*** 測試類,用于演示如何使用Spring IoC容器來創建和管理Bean。*/
public class MyTest {/*** 主方法,程序的入口點。** @param args 命令行參數*/public static void main(String[] args) {// 創建一個ClassPathXmlApplicationContext對象,用于從類路徑下的beans.xml文件中加載Bean定義ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 從Spring IoC容器中獲取id為"hello"的Bean,并將其轉換為Hello類型Hello hello = (Hello) context.getBean("hello");// 打印Hello對象的字符串表示形式,通常重寫了toString方法以顯示有意義的信息System.out.println(hello.toString());}}

5. 總結

通過使用Spring的IoC容器,我們可以將對象的創建和管理交給Spring,從而降低代碼之間的耦合度,提高代碼的可維護性和可測試性。具體實現方式包括:

  • 使用Set方法注入依賴

  • 使用構造函數注入依賴

  • 通過Spring配置文件管理Bean的創建和依賴注入

這種方式使得程序從主動創建對象轉變為被動接受對象,實現了控制反轉的設計思想。

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

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

相關文章

揭開Android Vulkan渲染封印:幀率暴增的底層指令

ps&#xff1a;本文內容較干&#xff0c;建議收藏后反復邊跟進源碼邊思考設計思想。壹渲染管線的基礎架構為什么叫渲染管線&#xff1f;這里是因為整個渲染的過程涉及多道工序&#xff0c;像管道里的流水線一樣&#xff0c;一道一道的處理數據的過程&#xff0c;所以使用渲染管…

HTTP 請求轉發與重定向詳解及其應用(含 Java 示例)

在 Web 開發中&#xff0c;我們經常需要在不同頁面之間跳轉&#xff0c;比如登錄成功后跳到首頁、提交表單后跳到結果頁面。這時&#xff0c;常見的兩種跳轉方式就是 請求轉發&#xff08;Request Forward&#xff09; 和 重定向&#xff08;Redirect&#xff09;。雖然它們都能…

如何將 MCP Server (FastMCP) 配置為公網訪問(監聽 0.0.0.0)

如何將 MCP Server &#xff08;FastMCP&#xff09; 配置為公網訪問&#xff08;監聽 0.0.0.0&#xff09;引言常見錯誤嘗試根本原因&#xff1a;從源碼解析正確的解決方案總結引言 在使用 Model Context Protocol(MCP) 框架開發自定義工具服務器時&#xff0c;我們經常使用 …

The Network Link Layer: 無線傳感器中Delay Tolerant Networks – DTNs 延遲容忍網絡

Delay Tolerant Networks – DTNs 延遲容忍網絡架構歸屬Delay Tolerant Networks – DTNs 延遲容忍網絡應用實例例子 1&#xff1a;瑞典北部的薩米人 (Saami reindeer herders)例子 2&#xff1a;太平洋中的動物傳感網絡DTNs路由方式——存儲&轉發DTNs移動模型Random walk …

計算機視覺(opencv)實戰二——圖像邊界擴展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 圖像邊界擴展詳解與實戰在圖像處理和計算機視覺中&#xff0c;有時需要在原始圖像的四周增加邊界&#xff08;Padding&#xff09;。這種操作在很多場景中都有應用&#xff0c;比如&#xff1a;卷積神經網絡&#xff08;CNN&#xff09;中的圖像預處理…

ansible管理變量和事實

ansible管理變量和事實與實施任務控制 在 Ansible 中&#xff0c;變量和事實&#xff08;Facts&#xff09;就像給劇本&#xff08;Playbook&#xff09;配備的 “信息工具箱”&#xff0c;讓你的自動化配置管理更靈活、更智能。 變量&#xff1a;提前準備的 “預設信息” 變…

STM32--寄存器與標準庫函數--基本定時器

目錄 前言 基本定時器概念 定時時間 定時器時鐘確定 倍頻鎖相環被正確配置為168MHz 定時器的庫函數操作 代碼 定時器的寄存器操作 代碼 寄存器 后言 前言 使用平臺:STM32F407ZET6 使用數據手冊&#xff1a;STM32F407數據手冊.pdf 使用參考手冊&…

PCA 實現多向量壓縮:首個主成分的深層意義

PCA 實現多向量壓縮 第一個主成分(components_[0])正是數據協方差矩陣中最大特征值對應的特征向量。 ,layer_attention_vector[layer] 被賦值為 pca.components_[0],這確實是一個特征向量,具體來說是 PCA 分解得到的第一個主成分(主特征向量)。 關于它的維度: 假設 c…

網絡常識-DNS如何解析

DNS&#xff08;Domain Name System&#xff0c;域名系統&#xff09;是互聯網的“地址簿”&#xff0c;負責將人類易記的域名&#xff08;如www.example.com&#xff09;轉換為計算機可識別的IP地址&#xff08;如192.168.1.1&#xff09;。其工作流程可以簡單理解為“從域名到…

Java中 23 種設計模式介紹,附帶示例

文章目錄設計模式六大原則設計模式分類1、創建型模式&#xff08;Creational Patterns&#xff09;2、結構型模式&#xff08;Structural Patterns&#xff09;3、行為型模式&#xff08;Behavioral Patterns&#xff09;一、創建型模式&#xff08;Creational Patterns&#x…

嵌入式開發入門——電子元器件~電磁繼電器、蜂鳴器

文章目錄電磁繼電器定義關鍵參數實物蜂鳴器實物內部結構分類關鍵參數電磁繼電器 定義 概述&#xff1a;電磁繼電器是利用電磁感應原理職稱的一種電磁開關&#xff0c;他能通過&#xff1a;低電壓、低電流的電路&#xff0c;來控制高電壓、高電流的電路。 關鍵參數 線圈電壓…

ROS2基礎

1.helloworld案例1.創建功能包&#xff08;C&#xff09;終端下&#xff0c;進入ws00_helloworld/src目錄&#xff0c;使用如下指令創建一個C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld執行完畢&a…

Python爬蟲實戰:研究pygalmesh,構建Thingiverse平臺三維網格數據處理系統

1. 引言 1.1 研究背景 在數字化浪潮席卷全球的當下,三維建模技術已成為連接虛擬與現實的核心紐帶,廣泛滲透于工程設計、地理信息系統(GIS)、虛擬現實(VR)、增強現實(AR)、醫學影像等關鍵領域。例如,在建筑工程中,BIM(建筑信息模型)技術依賴高精度三維網格實現施工…

開發者說 | EmbodiedGen:為具身智能打造可交互3D世界生成引擎

概述 具身智能的發展離不開高質量、多樣化的可交互3D仿真環境。為突破傳統構建方式的瓶頸&#xff0c;我們提出了EmbodiedGen&#xff0c;一個基于生成式AI技術的自動化3D世界生成引擎&#xff0c;助力低成本、高效率地創建真實且可交互的3D場景。用戶僅需輸入任務定義或場景圖…

GitHub Copilot:AI編程助手的架構演進與真實世界影響

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1. 技術背景與核心架構 GitHub Copilot 是由 GitHub 與 OpenAI 聯合開…

PDF OCR + 大模型:讓文檔理解不止停留在識字

在企業數字化的實際場景中&#xff0c;PDF OCR 已經很普遍了&#xff1a;從掃描件提取文本、表格到生成可搜索 PDF。但這類技術往往停留在"把圖片變成文字"&#xff0c;對文檔背后的語義、邏輯、業務價值理解不足。 而當 OCR 遇上大語言模型&#xff08;LLM&#xff…

半敏捷衛星觀測調度系統的設計與實現

半敏捷衛星觀測調度系統的設計與實現 摘要 本文詳細闡述了一個基于Python的半敏捷衛星觀測調度系統的設計與實現過程。系統針對半敏捷衛星特有的機動能力限制&#xff0c;綜合考慮了地面目標觀測需求、衛星資源約束、能源管理等多重因素&#xff0c;提出了一種混合啟發式算法解…

軟件測試中,常用的抓包工具有哪些?抓包的原理是什么?

回答重點在軟件測試中&#xff0c;常用的抓包工具主要有&#xff1a;1&#xff09;Fiddler2&#xff09;Wireshark3&#xff09;Charles4&#xff09;Postman&#xff08;它的攔截器功能也可以用于抓包&#xff09;5&#xff09;tcpdump抓包的原理大致是通過安裝在本地的抓包工…

Cesium學習(二)-地形可視化處理

Cesium地形可視化是其核心功能之一&#xff0c;允許開發者在3D地球中展示真實的地形數據。以下是關于Cesium地形可視化的詳細處理方法&#xff1a; 文章目錄1. 啟用地形可視化基本地形加載自定義地形提供者2. 地形相關操作地形高度采樣地形夸張效果3. 地形可視化設置地形照明效…

《告別 if-else 迷宮:Python 策略模式 (Strategy Pattern) 的優雅之道》

《告別 if-else 迷宮:Python 策略模式 (Strategy Pattern) 的優雅之道》 大家好,我是你的朋友,一位與 Python 代碼相伴多年的開發者。在我們的編程生涯中,幾乎都曾與一種“代碼怪獸”搏斗過,它就是那冗長、復雜、牽一發而動全身的 if-elif-else 結構。 每當一個新的需求…