Spring IoC和DI

目錄

一. Spring是什么

IoC

DI

二. IoC&DI的使用

IoC

1.@Controller(控制器存儲)

2.@Service(服務存儲)

3.@Repository(倉庫存儲)

4.@Componemt(組件存儲)

5.@Configuration(配置存儲)

多種類注解的作用

6.@Bean(方法注解)

指定路徑注解---@ComponentScan

bean的命名

1.五大注解存儲的bean

2.@Bean注解儲存

DI

1.屬性注入

2.構造方法注入

3.Set方法注入

三種注入方式的優缺點

@Autowired存在問題的解決方式


一. Spring是什么

Spring是一個包含眾多工具的IoC容器

容器:Tomcat--->web容器

? ? ? ? ? ? List/Map--->數據存儲容器

Spring容器裝的是對象。

IoC:控制反轉

控制權反轉,創建對象的控制權。

IoC

IoC的本質是為了解耦合。

舉個例子:

建筑汽車時,汽車依賴車身,車身依賴底盤,底盤依賴輪胎。

car--->framework--->bottom--->tire

普通方式:

當想要遭不同輪胎尺寸的車輛時,修改輪胎類,把size設置為輪胎屬性。于此同時要修改所有關聯的類。

這種方式改動一個屬性,需要需改所有關聯的代碼。

想要修改輪胎屬性,而不影響其他的關聯類,這個時候使用IoC的方式。

spring提供的IoC的思想:

每個類之間界限清晰,添加一個屬性時其他的類關聯性弱,Spring IoC需要做的就是管理對象,即實現下面Main方法的作用。

Spring幫助我們管理對象,我們需要做的事情:

1.告訴Spring,幫我們管理哪些對象

2.知道如何取出來這些對象

DI

IoC是一種思想,DI是一種實現方式。(注入依賴)

注入依賴,比如:上面的Car類中,把Framework注入Car中。

二. IoC&DI的使用

@Autowired:(英文:自動裝配),用來注入依賴

@Componemt:(英文意為組件,即對象),用來存取對象

以之前的圖書管理系統為例:

IoC

1.類注解:@Controller、?@Service、@Repository、@Componemt、@Configuration

2.方法注解:@Bean

1.@Controller(控制器存儲)

用@Controller存儲bean的代碼

2.@Service(服務存儲)

用@Service儲bean的代碼

getBean()提供的三種獲取bean的方式

@SpringBootApplication
public class IoCDemoApplication {public static void main(String[] args) {//Spring上下文,返回Spring的運行環境ApplicationContext context=SpringApplication.run(IoCDemoApplication.class, args);//從context中獲取beanUserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();//按照名稱來獲取beanUserService userService2 = (UserService)context.getBean("userService");userService2.doService();//根據名稱和類型獲取beanUserService userService3 = context.getBean("userService", UserService.class);userService3.doService();}}

bean的命名約定:小寫字母開頭,采用駝峰命名。

特殊情況:如果類名的前兩位都是大寫,bean的名稱不變

eg: UController------> "UController"

3.@Repository(倉庫存儲)

4.@Componemt(組件存儲)

5.@Configuration(配置存儲)

多種類注解的作用

這些類注解的用法相似,有這么多的類注解的目的是為了更好的應用分層,根據不同的類注解能直接了解當前類的用途。

@Controller(控制層)、?@Service(業務邏輯層)、@Repository(數據訪問層)、@Configuration(配置層)

注解之間的關系

@Controller、?@Service、@Repository都是@Componemt的衍生類,即@Componemt是他們的父類

若想讓外界訪問到,程序的入口只能使用@Controller

6.@Bean(方法注解)

1.上述五大注解只能加在類上,并且只能加在自己的代碼上,當想要引入一個第三方jar包,也希望交給Spring管理

2.當對于一個類想要定義多個對象時,無法用上述五大注解完成。

這兩種情況需可以使用@Bean方法注解

使用

1.@Bean必須搭配五大注解使用

2.使用@Bean注解時,一個類型存在多個bean時,不能使用類型獲取對象,使用bean的名稱獲取對象,bean的名稱是方法名

@Bean傳遞參數

如果需要的Bean的類型對應的對象只有一個時,就直接賦值。如果有多個時通過名稱來匹配。

指定路徑注解---@ComponentScan

SpringBoot的特點:約定大于配置

springBoot默認掃描路徑是啟動類所在的目錄及子孫目錄

比如:啟動類的代碼、位置大于我們自己的代碼

啟動類在哪里就只掃描哪個路徑下的文件內容

使用@ComponentScan指定路徑

bean的命名

1.五大注解存儲的bean

1.前兩位名稱全為大寫,bean名稱為類名

2.其他的為類名首字母小寫

3.通過value設置屬性,@Controller(value=xxx")

2.@Bean注解儲存

1.bean名稱為方法名

2.通過name屬性設置@Bean(name="aaa?","bbb")

DI

對依賴對象的注入,也被叫做“屬性裝配”、“依賴裝配”。

1.屬性注入

使用@Autowired

2.構造方法注入

存在無參的構造函數和有參的構造函數時,不加注釋會默認使用無參的構造函數

如果存在多個構造函數時,需要加上@Autowired注明使用哪個構造函數

如果只有一個構造函數,@Autowired可以省略掉

3.Set方法注入

三種注入方式的優缺點

1.屬性注入

優點:簡潔、使用方便

缺點:只能使用IoC容器、不能注入final修飾的屬性

2.構造函數注入

優點:可注入final修飾的屬性、注入的對象不會被修改;依賴對象在使用前一定會被初始化,因為依賴是在類的構造方法中執行的,而構造方法是在類加載階段就會執行;通用性好,構造方法是JDK支持的,所以更換任何框架都是試用的。

缺點:注入多個對象時,代碼會比較繁瑣。

3.Set方法注入

優點:方便實例后,重新對對象進行配置或注入。

缺點:注入對象可能會被改變,因為Setter方法可能會被多次調用,就有被修改的風險;不能注入一個final修飾的屬性。

@Autowired存在問題的解決方式

當程序中一個類型有多個對象時,使用@Autowired會報錯

解決方式:

1.屬性名和需要使用的對象名保持一致

2.使用@Primary注解標識默認的對象

3.使用@Qualifier

指定要使用的屬性

4.使用@Resource注解

使用@Autowired和使用@Resource的區別

1.@Autowired是Spring框架提供的,@Resource是JDK提供的

2.@Autowired默認按照類型注入,如果一個類型存在多個對象,按名稱匹配不上,就會報錯。而@Resource按照名稱注入,相比之下@Resource支持更多的參數設置

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

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

相關文章

解決Could not establish connection to : XHR failed

解決Could not establish connection to : XHR failed 問題描述 用vscode用遠程連接服務器時總報上面的錯誤,用xshell和Xftp和vscode終端都可以連上,但是用vscode的ssh連接缺總報錯,導致無法連接服務器進行代碼調試 一、原因 原因可能是在…

【MATLAB】 數據、矩陣、行、列翻轉

1.MATLAB函數fliplr 用法:fliplr(X) 功能:matlab中的fliplr函數實現矩陣的左右翻轉。 fliplr(X)使矩陣X沿垂直軸左右翻轉。 相關函數:flipud函數可以實現矩陣的上下翻轉。 備注:matlab中提供了許多對矩陣操作的函數,可…

Go json 差異比較 json-diff(RFC6902)

Go json 差異比較 json-diff(RFC 6902) 畢業設計中過程中為了比較矢量圖的差異而依據 RFC 6902 編寫的一個包,現已開源: Json-diff 使用 go get -u github.com/520MianXiangDuiXiang520/json-diff序列化與反序列化 與官方 json 包的序列化和反序列化不…

后端開發面試題

這是一波今年7月份的大廠面試題,分享下~~ Mybatis三級緩存 Mybatis懶加載 分布式事務 transaction gradle和maven區別 抽象類、多態 Springboot啟動 ConcurrentHashMap 樂觀鎖、悲觀鎖 docker k8s常用命令 電商業務從什么維度分庫分…

AcWing 95. 費解的開關(遞推)

題目鏈接 活動 - AcWing 本活動組織刷《算法競賽進階指南》,系統學習各種編程算法。主要面向有一定編程基礎的同學。https://www.acwing.com/problem/content/97/ 題解 只要第一行開關的狀態確定,則所有開關的狀態都可以被推出來。第一行開關總共有種操…

jemeter,同一線程組內,調用cookie實現接口關聯

取cookie方式參考上一篇:jemeter,取“臨時重定向的登錄接口”響應頭中的cookie-CSDN博客 元件結構 登錄后要執行的接口為“api/get_event_list/”,在該HTTP請求下創建HTTP信息頭管理器,配置如下: 執行測試后&#xff0…

【ensp實踐】eNSP實戰篇(4)用eNSP實驗來認識什么是OSPF及OSPF配置?

OSPF目錄 寫在前面涉及知識一、什么是OSPF?二、OSPF特性(優缺點)2.1 OSPF優點2.2 OSPF缺點 三、OSPF實驗3.1 打開ensp,添加設備3.2 建立連線3.3 配置及ospf命令【核心】3.3.1 配置PC機3.3.2 設置命令 3.4 驗證效果3.4.1、驗證OSPF…

Spring IoC如何存取Bean對象

小王學習錄 IoC(Inversion of Control)1. 什么是IoC2. 什么是Spring IoC3. 什么是DI4. Spring IoC的作用 存儲Bean對象1. 創建Bean2. 將Bean注冊到Spring中. 取Bean對象.1. 獲取Spring上下文信息使用ApplicationContext和BeanFactory的區別 2. 獲取指定Bean對象 IoC(Inversion …

使用JLink仿真器實現調試打印的N種方法

方法一:使用MCU的串口 這是最古老也是最簡單的方法。 電腦上面插一個USB轉TTL,然后與MCU的UART_RX/UART_TX/GND連接起來。PC端再打開一個串口調試助手。兩邊的波特率一致,就可以收到MCU發過來的打印信息了。 方法二:使用JLink仿…

【EMNLP 2023】面向Stable Diffusion的自動Prompt工程算法

近日,阿里云人工智能平臺PAI與華南理工大學朱金輝教授團隊合作在自然語言處理頂級會議EMNLP2023上發表了BeautifulPrompt的深度生成模型,可以從簡單的圖片描述中生成高質量的提示詞,從而使文生圖模型能夠生成更美觀的圖像。BeautifulPrompt通…

Android--Jetpack--Databinding源碼解析

慢品人間煙火色,閑觀萬事歲月長 一,基本使用 關于databinding的基本使用請看之前的文章 Android--Jetpack--Databinding詳解-CSDN博客 二,xml布局解析 分析源碼呢,主要就是從兩方面入手,一個是使用,一個…

STM32F407-14.1.0-01高級定時器簡介

TIM1 和 TIM8 簡介 高級控制定時器(TIM1 和 TIM8)包含一個 16 位自動重載計數器,該計數器由可編程預分頻器驅動。 此類定時器可用于各種用途,包括測量輸入信號的脈沖寬度(輸入捕獲),或者生成輸出…

微軟NativeApi-NtQuerySystemInformation

微軟有一個比較實用的Native接口:NtQuerySystemInformation,具體可以參考微軟msdn官方文檔:NtQuerySystemInformation, 是一個系統函數,用于收集特定于所提供的指定種類的系統信息。ProcessHacker等工具使用NtQuerySys…

Javascript 數組array賦值與取值

Javascript 數組array賦值與取值 目錄 Javascript 數組array賦值與取值 一、數組元素的賦值 1、在創建Array對象時直接賦值 2、利用Array對象的元素下標對數組進行賦值 二、數組元素的獲取 一、數組元素的賦值 對數組元素賦值共有2種方法: (1&am…

每日一題,頭歌平臺c語言題目

任務描述 題目描述:輸入一個字符串,輸出反序后的字符串。 相關知識(略) 編程要求 請仔細閱讀右側代碼,結合相關知識,在Begin-End區域內進行代碼補充。 輸入 一行字符 輸出 逆序后的字符串 測試說明 樣例輸入&…

項目實戰第四十七講:易寶支付對接詳解(保姆級教程)

易寶支付對接(保姆級教程) 為了實現項目的支付需求,公司選擇了易寶支付進行對接,本文是項目實戰第四十七講,詳解易寶支付對接。 文章目錄 易寶支付對接(保姆級教程)1、需求背景2、流程圖3、技術方案4、相關接口4.1、入駐相關(商戶入網)4.2、賬戶相關接口(充值、提現、…

【LVGL】STM32F429IGT6(在野火官網的LCD例程上)移植LVGL官方的例程(還沒寫完,有問題 排查中)

這里寫目錄標題 前言一、本次實驗準備1、硬件2、軟件 二、移植LVGL代碼1、獲取LVGL官方源碼2、整理一下,下載后的源碼文件3、開始移植 三、移植顯示驅動1、enable LVGL2、修改報錯部分3、修改lv_config4、修改lv_port_disp.c文件到此步遇到的問題 Undefined symbol …

Vue路由守衛筆記

路由守衛 當路由切換時,判斷權限 路由守衛類型 1.全局守衛 2.獨享守衛 3.組件內守衛 1.全局守衛 1.前置路由守衛 全局前置路由守衛————初始化的時候被調用、每次路由切換之前被調用 在需要加上路由守衛的路由配置中加上 meta:{isAuth&#xff1…

x的平方根算法(leetcode第69題)

題目描述: 給你一個非負整數 x ,計算并返回 x 的 算術平方根 。由于返回類型是整數,結果只保留 整數部分 ,小數部分將被 舍去 。注意:不允許使用任何內置指數函數和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。…