Spring IOC與DI

spring的兩大思想:IOC與AOP

一、ioc的概念

什么叫控制翻轉?

之前:

對象的使用方,創建對象,對象的控制權,在對象的使用方手中.

spring:

對象的控制權交給了spring.

舉個例子:智能駕駛,之前車的使用權在人手中,而現在在ai手中,這就是控制反轉.

什么叫ioc:

之前車企生產車需要做整個車,費事費力無法定制化,而現在車企將輪胎輪轂車底等外包給別人做,自己制作組裝:

二、DI

本質上就是想在不new的基礎上完成對象引入,目的是解耦.

依賴注入分為三種:

1.屬性注入

    @Autowiredprivate  StudentController studentController;public void say(){System.out.println("helloworld");studentController.say();}

@Autowired就是屬性注入的注釋\

正常來說應該是

這樣,但是加了屬性注入注釋就將這個注入到這個對象中了.

// 1. 定義一個服務類(被依賴的對象)
@Service // 告訴Spring:這是一個服務,需要被容器管理
public class UserService {public void doService() {System.out.println("執行服務邏輯");}
}// 2. 定義控制器(需要依賴的對象)
@Controller // 告訴Spring:這是一個控制器,需要被容器管理
public class UserController {// 3. 聲明依賴:告訴Spring,我需要一個UserService對象@Autowired private UserService userService;public void doController() {// 直接使用注入的對象,不用自己newuserService.doService(); }
}

@Autowired會根據名稱進行注入,如果服務類中有多個名字對不上的該怎么辦呢?有三種方法:

@Autowired與@Resource的區別:

1.注入順序

? @Autowired:默認按類型(Type)匹配注入。

  • 先根據字段 / 參數的類型在 Spring 容器中查找匹配的 Bean。
  • 如果存在多個同類型的 Bean,需要配合?@Qualifier?注解按名稱(Name)篩選,否則會報錯。
    示例:
    @Autowired
    @Qualifier("userServiceA") // 指定名稱為userServiceA的Bean
    private UserService userService;

    @Resource:默認按名稱(Name)匹配注入,名稱可以通過?name?屬性指定。

  • 若未指定?name,則默認使用字段名或 setter 方法名作為 Bean 名稱。
  • 若按名稱找不到匹配的 Bean,會 fallback 到按類型匹配。
    示例:
    @Resource(name = "userServiceA") // 直接指定Bean名稱
    private UserService userService;// 未指定name時,默認按字段名"userService"查找
    @Resource
    private UserService userService;
2.來源

@Autowired是spring提供的注釋,@Resource是JDK提供的注釋.

2.構造方法注入

通過構造方法進行注入

package com.example.demo;import org.springframework.stereotype.Controller;// 控制器類(需要依賴的對象)
@Controller
public class UserController {// 依賴的服務對象,使用final修飾確保不可變private final UserService userService;// 構造方法注入:通過構造方法傳入依賴// Spring會自動找到匹配的UserService對象注入進來public UserController(UserService userService) {this.userService = userService;}public void showUserName() {// 使用注入的依賴對象System.out.println("用戶名:" + userService.getUserName());}
}

總所周知,構造方法可以有無參和有參,這是怎么告訴spring哪個是我們想要的:

@Controller
public class UserController {private final UserService userService;// 無參構造方法(手動定義)public UserController() {// 注意:如果用無參構造創建對象,userService會為nullthis.userService = null;}// 有參構造方法(用于注入依賴)@Autowired // 必須添加,否則Spring會優先用無參構造public UserController(UserService userService) {this.userService = userService;}public void doSomething() {userService.doService(); // 只有通過有參構造創建的對象才能正常調用}
}

3.setter方法注入

package com.example.demo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController {private UserService userService;// setter方法注入:通過setter方法傳入依賴@Autowired // 標注在setter方法上public void setUserService(UserService userService) {this.userService = userService;}public void showUserName() {// 使用注入的依賴對象System.out.println("用戶名:" + userService.getUserName());}
}

三、bean的存儲

將對象交給spring進行管理可以使用下面的這些注釋:

類注解:

用代碼來講解:

@Controller
public class UserController {public void say(){System.out.println("hello world");}
}

創建一個UserController類,如果要使用其中的對象就得new UserController(),來實例化對象,而此處我們加上@Controller后就是將對象托管給spring,而我們只需要從Spring中取對象即可,下面講解一下取對象的具體步驟:

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context=SpringApplication.run(DemoApplication.class, args);//1.通過類型取UserController controller=context.getBean(UserController.class);controller.say();//2.通過名字取UserController userController1=(UserController) context.getBean("userController");userController1.say();//3.通過名字和類型雙重查找UserController userController2=context.getBean("userController",UserController.class);userController2.say();}}

之后幾個跟controller差不多

方法注解:

使用場景:

1.想修改第三方的無法修改的類

2.想使用多個對象時

代碼解釋:如此時有個無法修改的第三方類

@AllArgsConstructor//添加一個全參數的構造函數
@NoArgsConstructor//添加一個無參數的構造函數
@Data
public class Student {private String name;private int age;
}

想使用它只能外置一個類:

@Component
public class StudentController {@Beanpublic Student userInfo(){return new Student("zhansan",15);}
}

注意此處的方法注釋@Bean必須和任意一個類注釋一起使用,要先讓spring知道你需要托管.

另外也可以new多個對象,但這里就不能通過類型去取了:

@Component
public class StudentController {@Beanpublic Student userInfo(){return new Student("zhangsan", 20);}@Beanpublic Student userInfo1(){return new Student("lisi", 22);}
}

也可以修改默認名字或者添加復數個名字:

指定掃描路徑

在spring搜索bean位置的時候會根據包的存儲位置存儲

也就是這個,有可能你分的包比較多,讓spring無法搜索到你指定的bean,是可以進行修改的:

@ComponentScan("com.example.dome")

總結:

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

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

相關文章

【圖像處理基石】Segment Anything Model (SAM) 調研

Segment Anything Model (SAM) 是由 Meta AI 開發的革命性圖像分割模型,它能夠對圖像中的任何物體進行分割,無需針對特定類別進行訓練。SAM 具有以下特點: 通用性:可以分割任何視覺對象,無論是否見過該類別 靈活性:支持多種輸入提示(點、框、掩碼或文本) 實時性:在普通…

unisS5800XP-G交換機配置命令之端口篇

一、批量配置端口(1) 進入系統視圖。system-view(2) 指定接口范圍&#xff0c;并進入接口批量配置視圖。¡ 指定一個不帶別名的接口列表。interface range { interface-type interface-number [ to interface-type interface-number ] } &<1-24>¡…

MySQL中的 redolog

什么是redo log如果我們只在內存的 Bufer Pool中修改了頁面&#xff0c;假設在事務提交后突然發生了某個故障導致內存中的數據都失效了&#xff0c;那么這個已經提交的事務在數據庫中所做的更改也就跟著丟失了&#xff0c;這是我們所不能忍受的。那么&#xff0c;如何保證這個持…

數據結構之 【排序】(非遞歸實現快速排序)

目錄 1.引入 2.非遞歸實現快排的思想 3.非遞歸實現快排圖解 4.完整代碼 1.引入 遞歸不可避免的話題就是防止棧溢出 所以程序員需要具備遞歸改非遞歸的能力 &#xff0c;一般來說&#xff0c;抓住遞歸中變化的量是關鍵 void QuickSort(int* a, int left, int right){if (left…

CLAP文本-音頻基礎模型: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISION

一、TL&#xff1b;DR 現在的做法有什么問題&#xff1f;主流范式是 “一個類別標簽對應多個錄音”&#xff0c;需要提前標注預測預先定義的類別&#xff0c;只能做閉集理解&#xff0c;失去靈活性 我們怎么做&#xff1f;通過兩個編碼器和對比學習機制建立語言與音頻的關聯&a…

Flink2.0學習筆記:Stream API 常用轉換算子

EC0720/FLINKTASK-TEST-STREAM/demo at master stevensu1/EC0720 先看測試效果&#xff1a;控制臺 測試效果&#xff1a;監控服務端 主要的轉換算子包括&#xff1a; 轉換算子 filter:過濾包含“Flink”的輸入 轉換算子 map: 將每行數據前添加“Processed: ”并轉為大寫 轉…

一、Python環境、Jupyter與Pycharm

安裝Python由于RAG項目中所需要的Python版本必須高于3.8&#xff0c;經過篩選&#xff0c;最終選擇了3.10.11這個版本py --version Python 3.10.11安裝過程略過&#xff0c;但對于幾個基礎的命令作個筆記記錄where python找到python啟動器的位置D:\>where python C:\Users\x…

Flink CEP 動態模板與規則動態修改實踐完全手冊

1. Flink CEP:從靜態規則到動態江湖 Flink 的復雜事件處理(CEP)庫就像一個武功高強的俠客,能從數據流中精準捕獲特定模式,堪稱流處理界的“降龍十八掌”。但問題來了:傳統 CEP 規則通常是寫死在代碼里的,就像刻在石碑上的武功秘籍,改起來費勁不說,還得重啟應用,簡直…

vue3.2 + echarts5.6 + ant-design-vue 3.x 實現自定義 echarts 圖例

文章目錄概要技術細節效果概要 需求需要實現圖例移入顯示描述說明 故實現自定義圖例 技術細節 <template><div class"custom-legend"><divv-for"item in legends":key"item.name"class"legend-item":class"{ i…

【2025年7月25日】TrollStore巨魔商店恢復在線安裝

就在今日7月25日&#xff0c;TrollStore的在線安裝功能再次變得可用&#xff0c;這對于許多iPhone用戶來說無疑是個喜訊。在經歷了近三個月的中斷后&#xff0c;巨魔商店的企業證書意外的到來了&#xff0c;使得用戶能夠重新采用在線安裝的方式&#xff01; 在線安裝地址在文…

【05】C#入門到精通——C# 面向對象、類、靜態變量static、類與類之間的調用

文章目錄1 引入例子2 創建類2.1 類的訪問屬性2.2 英雄 特點類2.3 英雄信息打印3 靜態變量static4 類 調用 類4.1 非靜態 成員函數4.2 靜態 成員函數1 引入例子 比如游戲中 描述英雄的角色&#xff0c; 我們可以像下面這樣&#xff0c;給每一個英雄特點及擁有技能分別定義變量…

單片機的硬件結構

單片機的硬件結構 一、課程導入 在上一節課《認識單片機》中&#xff0c;我們知道單片機就像一個超級迷你的工廠&#xff0c;有著類似工廠的各個組成部分。而這個 “迷你工廠” 能正常運轉&#xff0c;離不開其內部嚴謹的硬件結構。就像一座大廈&#xff0c;只有基礎結構穩固且…

multiprocessing模塊使用方法(二)

spawn_main是Python multiprocessing模塊的核心內部函數&#xff0c;用于實現spawn啟動方法的子進程初始化。以下結合代碼Demo詳細說明其使用方法和推薦場景。一、spawn_main的功能與定位核心作用&#xff1a; 在spawn模式下啟動子進程&#xff0c;負責進程間通信管道的建立和資…

編程與數學 03-002 計算機網絡 07_路由算法

編程與數學 03-002 計算機網絡 07_路由算法一、靜態路由算法&#xff08;一&#xff09;手工配置路由表的方法&#xff08;二&#xff09;靜態路由的優缺點二、動態路由算法原理&#xff08;一&#xff09;距離矢量算法&#xff08;如貝爾曼 - 福特算法&#xff09;&#xff08…

使用Python,OpenCV計算跑圖的圖像彩色度

使用Python&#xff0c;OpenCV計算跑圖的圖像彩色度 這篇博客將介紹如何計算跑圖里最鮮艷的top25圖片和最灰暗的top25圖片并顯示色彩彩色度值展示。 效果圖 以下分別是最鮮艷top25和最灰暗top25對比效果圖&#xff1a; 最鮮艷top25效果圖&#xff1a; 最灰暗top25效果圖…

LeetCode 60:排列序列

LeetCode 60&#xff1a;排列序列問題定義與核心挑戰 給定整數 n 和 k&#xff0c;返回集合 {1,2,...,n} 的第 k 個字典序排列。直接生成所有排列再遍歷到第 k 個的方法&#xff08;時間復雜度 O(n!)&#xff09;會因 n≥10 時階乘爆炸而超時&#xff0c;因此需要 數學推導 貪…

亞遠景-傳統功能安全VS AI安全:ISO 8800填補的標準空白與實施難點

一、為什么需要ISO 8800&#xff1a;傳統安全標準的“盲區”傳統功能安全&#xff08;ISO 26262&#xff09;? 假設&#xff1a;系統行為可被完整規格化&#xff0c;失效模式可枚舉&#xff0c;風險可用概率-危害矩陣量化。? 盲區&#xff1a;對“設計意圖正確&#xff0c;但…

菜鳥教程 R語言基礎運算 注釋 和數據類型

菜鳥教程 R語言基礎運算 注釋 和數據類型 1.注釋 注釋主要用于一段代碼的解析&#xff0c;可以讓閱讀者更易理解&#xff0c;編程語言的注釋會被編譯器忽略掉&#xff0c;且不會影響代碼的執行。 一般編程語言的注釋分為單行注釋與多行注釋&#xff0c;但是 R 語言只支持單行注…

華為云ELB(彈性負載均衡)持續報異常

華為云ELB&#xff08;彈性負載均衡&#xff09;持續報異常&#xff0c;需結合實例類型&#xff08;共享型/獨享型&#xff09;和異常代碼進行針對性排查。以下是分步排查建議&#xff1a;一、根據實例類型排查網絡配置共享型實例 安全組規則&#xff1a;檢查后端服務器安全組是…

《R for Data Science (2e)》免費中文翻譯 (第2章) --- Workflow: basics

寫在前面 本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github&#xff0c;歡迎大家參與貢獻&#xff0c;詳細信息見&#xff1a; Books-zh-cn 項目介紹&#xff1a; Books-zh-cn&#xff1a;開源免費的中文書籍社區 r4ds-zh-cn …