詳解Spring IoCDI(二)

目錄

承接上文:詳解Spring IoC&DI (一)

1.IoC詳解

1.1方法注解@Bean

1.2方法注解要配合類注解使用?

1.3定義多個對象

1.4重命名Bean

1.5掃描路徑

2.DI詳解

2.1DI與IoC的關系

2.2屬性注入

2.3構造方法注入

?2.4Setter注入

2.5?三種注入優缺點分析

2.6Autowired存在問題

2.6.1Primary

?2.6.2Qualifier

2.6.3Resource


承接上文:詳解Spring IoC&DI (一)

1.IoC詳解

1.1方法注解@Bean

類注解是添加到某個類上的??但是存在兩個問:

1.使?外部包?的類,?沒辦法添加類注解

2.?個類, 需要多個對象, 比如多個數據源

這種場景,?我們就需要使??法注解@Bean

代碼示例:

 public class BeanConfig { @Beanpublic User user(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;}}

當我們寫完以上代碼?,嘗試獲取 bean 對象中的 user 時卻發現?,根本獲取不到:

@SpringBootApplication
public class TestSpringTwoApplication {public static void main(String[] args) {ApplicationContext context =  SpringApplication.run(TestSpringTwoApplication.class,args);//從Spring上下?中獲取對象User user =context.getBean(User.class);//使?對象System.out.println(user);}
}

執行結果如下:?

1.2方法注解要配合類注解使用?

Spring?框架的設計中?,?法注解?@Bean?要配合類注解才能將對象正常的存儲到Spring?容器中

如下代碼所示:

 @Componentpublic class BeanConfig { @Beanpublic User user(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;}}

再次執?以上代碼?,運?結果如下:

1.3定義多個對象

多數據源的場景, 類是同?個, 但是配置不同,?指向不同的數據源.

@Component
public class BeanConfig {@Beanpublic User user1(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;}@Beanpublic User user2(){User user = new User();user.setName("lisi");user.setAge(28);return user;}}

獲取對象:

@SpringBootApplication
public class TestSpringTwoApplication {public static void main(String[] args) {ApplicationContext context =  SpringApplication.run(TestSpringTwoApplication.class, args);//從Spring上下?中獲取對象User user1 = (User) context.getBean("user1");User user2 = (User) context.getBean("user2");//使?對象System.out.println(user1);System.out.println(user2);}
}

運行結果:

1.4重命名Bean

可以通過設置 name 屬性給 Bean 對象進?重命名操作?,如下代碼所示

@Bean(name = {"u1","user1"})public User user1(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;}

此時我們使用u1就可以獲取到User對象:

 User u1 = (User) context.getBean("u1"); 

name={} 可以省略?,如下代碼所?:?

 @Bean({"u1","user1"})public User user1(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;}

只有?個名稱時, {}也可以省略, :

 @Bean("u1")public User user1(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;}

1.5掃描路徑

使?前?學習的四個注解聲明的bean想要?效?,還需要Spring掃描

通過修改項目工程的目錄結構進行測試:

運行結果:

?解釋: 沒有bean的名稱為u1,

使?五?注解聲明的bean?,要想?效, 還需要配置掃描路徑, Spring掃描到這些注解也就是通過

@ComponentScan來配置掃描路徑.

@ComponentScan({"com.example.demo"}) 
@SpringBootApplication
public class TestSpringTwoApplication {public static void main(String[] args) {ApplicationContext context =  SpringApplication.run(TestSpringTwoApplication.class,args);//從Spring上下?中獲取對象User user =context.getBean(User.class);//使?對象System.out.println(user);}
}

@ComponentScan注解雖然沒有顯式配置,但是實際已經包含在了啟動類聲明注解

@SpringBootApplication中了,默認掃描的范圍是啟動類所在包及其子包

?

2.DI詳解

2.1DI與IoC的關系

DI(Dependency Injection,依賴注入)和 IoC(Inversion of Control,控制反轉)有著密切的關系。 可以說 DI 是實現 IoC 的一種具體方式。 IoC 是一種設計思想,強調將對象之間的控制權進行反轉,不再由對象自己去創建或獲取其依賴,而是由外部(如框架)來控制和管理依賴關系的創建和注入。 而 DI 則側重于具體的將依賴對象注入到目標對象的操作,它是實現 IoC 理念的重要手段之一。通過 DI,依賴對象在合適的時候被準確地注入到需要它們的對象中,從而體現了 IoC 的原則。 簡單來說,IoC 是更宏觀的概念,DI 是實現 IoC 的具體策略和機制。

關于依賴注?, Spring也給我們提供了三種?式:

屬性注?(Field?Injection)、構造?法注?(Constructor?Injection)、Setter?注?(Setter?Injection)

2.2屬性注入

 @SpringBootApplicationpublic class SpringIocDemoApplication { public static void main(String[] args) { //獲取Spring上下?對象ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio //從Spring上下?中獲取對象UserController userController = (UserController) context.getBean("userCont //使?對象userController.sayHi(); 11    }}

屬性注?是使用@Autowired實現的?,將 Service?類注?到 Controller?類中.

Service類的實現代碼如下:?

 import org.springframework.stereotype.Service; @Servicepublic class UserService {public void sayHi() {System.out.println("Hi,UserService");}}

Controller?類的實現代碼如下:

 @Controllerpublic class UserController { //注??法1: 屬性注?@Autowiredprivate UserService userService;public void sayHi(){System.out.println("hi,UserController...");userService.sayHi();}}

獲取Controller中的sayHi方法:?

 @SpringBootApplicationpublic class SpringIocDemoApplication { public static void main(String[] args) { //獲取Spring上下?對象ApplicationContext context =  SpringApplication.run(TestSpringTwoApplication.class,args);//從Spring上下?中獲取對象UserController userController = context.getBean(UserController.class);//使?對象userController.sayHi(); }}

?運行結果為:

2.3構造方法注入

構造方法注入是在類的構造方法中實現注入,如下代碼所示:

@Controller
public class UserController2 { //注??法2: 構造?法private UserService userService; @Autowiredpublic UserController2(UserService userService) {this.userService = userService;} public void sayHi(){System.out.println("hi,UserController2...");userService.sayHi();}}

注意事項:如果類只有?個構造?法?,那么@Autowired?注解可以省略;如果類中有多個構造?法, 那么需要添加上@Autowired?來明確指定到底使?哪個構造?法。

?2.4Setter注入

Setter?注?和屬性的 Setter?方法實現類似?,只不過在設置 set?方法的時候需要加上@Autowired?解 ,如下代碼所示:

 @Controllerpublic class UserController3 { //注??法3: Setter?法注?private UserService userService; @Autowiredpublic void setUserService(UserService userService) {this.userService = userService;} public void sayHi(){System.out.println("hi,UserController3...");userService.sayHi();}}

2.5?三種注入優缺點分析

屬性注?

??優點: 簡潔?,使??便;?

??缺點:只能?于 IoC 容器?并且只有在使?的時候才會出現 NPE?空指針異常)、?能注入?個Final修飾的屬性

?構造函數注?(Spring 4.X推薦)?

?優點:可以注?final修飾的屬性、注?的對象不會被修改、依賴對象在使?前?定會被完全初始化?,因為依賴是在類的構造?法中執?的?,?構造?法是在類加載階段就會執?的?法、?通?性好, 構造?法是JDK?持的, 所以更換任何框架,他都是適?的

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

??Setter注?(Spring?3.X推薦)

?優點: ?便在類實例之后, 重新對該對象進?配置或者注?

缺點:不能注??個Final修飾的屬性、注?對象可能會被改變, 因為setter?法可能會被多次調??, 就有被修改的風險.

2.6Autowired存在問題

當同?類型存在多個bean, 使?@Autowired會存在問題

@Componentpublic class BeanConfig { @Bean("u1")public User user1(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;} @Beanpublic User user2() {User user = new User();user.setName("lisi");user.setAge(19);return user;}}
 @Controllerpublic class UserController { //注?user @Autowiredprivate User user;public void sayHi(){System.out.println("hi,UserController...");userService.sayHi();System.out.println(user);}}

運行結果:?

報錯的原因是?,?唯—的 Bean 對象。

Spring提供了以下幾種解決?案:

2.6.1Primary

@Primary注解:?當存在多個相同類型的Bean注?時?,加上@Primary注解?來確定默認的實現.

 @Componentpublic class BeanConfig { @Primary //指定該bean為默認bean的實現@Bean("u1")public User user1(){User user = new User();user.setName("zhangsan");user.setAge(18);return user;} @Beanpublic User user2() {User user = new User();user.setName("lisi");user.setAge(19);return user;}}

?2.6.2Qualifier

指定當前要注?的bean對象。 在@Qualifiervalue屬性中?,指定注?的bean 的名稱。

?@Qualifier注解不能單獨使? ,必須配合@Autowired使用

 @Controllerpublic class UserController {@Qualifier("user2") //指定bean名稱@Autowiredprivate User user;public void sayHi(){System.out.println("hi,UserController...");System.out.println(user);}}

2.6.3Resource

使?@Resource注解:是按照bean的名稱進?注?。通過name屬性指定要注?的bean的名稱。

 @Controllerpublic class UserController { @Resource(name = "user2")private User user; public void sayHi(){System.out.println("hi,UserController...");System.out.println(user);}}

@Autowird @Resource的區別

? ?@Autowired?spring框架提供的注解?,而@ResourceJDK提供的注解

? ?@Autowired 默認是按照類型注??,?@Resource是按照名稱注??. 相?于 @Autowired ?來說,?@Resource??持更多的參數設置?,例如 name 設置?,根據名稱獲取 Bean

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

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

相關文章

代碼隨想錄算法訓練營第四十五天|1049.最后一塊石頭的重量II、494.目標和、 474.一和零

1049.最后一塊石頭的重量II 文檔講解:代碼隨想錄 題目鏈接:. - 力扣(LeetCode) 本題其實就是盡量讓石頭分成重量相同的兩堆,相撞之后剩下的石頭最小,這樣就化解成01背包問題了。 和昨天講解的416. 分割等和…

visual studio code 全局搜索

VScode寫代碼的時候,會經常性的需要進行查找代碼,那么怎么在Visual Studio Code中進行查找呢,下面就來大家vscode全局搜索的方法。 想要在vscode全局搜索進行全局搜索,使用快捷鍵CTRLSHIFTF即可進行搜索,也可以在左邊…

哪吒監控+cfcdn+ 反代grp端口

哪吒監控cfcdn 反代grp端口 背景: 哪吒監控:感覺VPS線路不穩定,為了打消自己潛意識,希望量化延遲。 cfcdn:隱藏真實站點,保障小雞隱秘安全 反代grpc端口: 反代grpc到支持https(TLS)的端口,這…

Tomcat啟動閃退問題及解決方法

Tomcat啟動閃退問題可能由多種原因引起,以下是一些常見的原因及相應的解決方法,按照清晰的結構進行歸納: 一、環境變量問題 Java環境問題:Tomcat依賴于Java環境,如果JDK未正確安裝或環境變量配置不正確,會…

Elasticsearch 認證模擬題 - 3

1、題目 有一索引有 3 個字段,請寫一個查詢去匹配這三個字段,并且將三個字段的評分相加作為最后的總評分 # 創建索引 PUT task {"mappings": {"properties": {"fielda":{"type": "text"},"fie…

TrueNAS開啟SSH登錄ROOT

簡介: 從 SCALE Bluefin 22.12.0 開始,為了加強安全性并遵守聯邦信息處理標準 (FIPS),root帳戶登錄已被棄用。所有 TrueNAS 用戶都應創建具有所有必需權限的本地管理員帳戶,并開始使用它來訪問 TrueNAS。當根用戶密碼被禁用時,只有管理用戶帳戶才能登錄 TrueNAS Web 界面。…

從零學算法2965

2965. 找出缺失和重復的數字 給你一個下標從 0 開始的二維整數矩陣 grid,大小為 n * n ,其中的值在 [1, n2] 范圍內。除了 a 出現 兩次,b 缺失 之外,每個整數都 恰好出現一次 。 任務是找出重復的數字a 和缺失的數字 b 。 返回一個…

輪狀病毒簡介-卡梅德生物

輪狀病毒是一種非常常見的病毒,主要影響嬰幼兒和小孩,引起嚴重的胃腸炎,表現為嚴重腹瀉、嘔吐、發燒和脫水。這種病毒全球流行,是全世界五歲以下兒童因腹瀉導致死亡的主要原因之一。輪狀病毒屬于Reoviridae家族,具有雙…

邏輯回歸【python,機器學習,算法】

邏輯回歸是一種有監督的學習分類算法,用于預測目標變量的概率。目標或因變量的性質是二分法的,這意味著將只有兩個可能的類。主要解決二分類問題。 主要步驟有三個: 求線性回歸曲線。通過 sigmoid 函數將線性回歸曲線轉為 0-1 范圍函數。 …

機器學習-11-使用kaggle命令下載數據集和操作指南

參考kaggle API 命令下載數據集 參考Kaggle操作完整指南(2023版) 參考Kaggle如何入門? 1 kaggle操作指南 Kaggle 是一個流行的數據科學競賽平臺。由 Goldbloom 和 Ben Hamner 創建于 2010 年。為什么這兩個家伙要創立這樣一個平臺呢? 數據科學社區一直有這樣一個難題:對…

低代碼開發平臺(Low-code Development Platform)的模塊組成部分

低代碼開發平臺(Low-code Development Platform)的模塊組成部分主要包括以下幾個方面: 低代碼開發平臺的模塊組成部分可以按照包含系統、模塊、菜單組織操作行為等維度進行詳細闡述。以下是從這些方面對平臺模塊組成部分的說明: …

docker安裝mysql8和mysql5.7

1.docker安裝mysql5.7,請點擊此鏈接 2.docker安裝mysql8并掛載數據卷 docker pull mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -v /mqq/mysql8/datadir:/var/lib/mysql -d…

虛擬dom的理解

由普通的js對象來描述dom對象,是對于真實dom的映射,因為不是真實的dom對象所以叫虛擬dom。因為js處理數據的速度比操作dom的速度更快,性能更好,所以讓現代這些react vue 等框架都采用了虛擬dom。 key值是唯一性的,在虛擬dom樹進行…

【喜報】科大睿智服務企業通過CMMI3級認證

?北京建投科信科技發展股份有限公司(以下簡稱“北京建投科技” )前身為北京銀帝科技發展公司,成立于1993年,注冊資本6,000萬元,為中國建銀投資有限責任公司(簡稱“中國建投”)的成員企業建投華…

現在,所有人都能免費用GPT-4o了!

OpenAI今日官宣,ChatGPT正式向所有用戶免費開放!所有用戶均可以訪問定制化GPT、分析圖表、詢問有關照片的問題以及5月初GPT-4o添加的其他功能。 OpenAI今天在X上發布推文: 「所有ChatGPT免費用戶現在都可以使用瀏覽、視覺、數據分析、文件上…

element table表格行列合并span-method,根據數據動態行列合并

表格行列合并需要用到 table的方法 span-method 根據數據來進行動態的行列合并&#xff0c;實例如下&#xff1a; <el-table:data"tableData":span-method"objectSpanMethod" style"width: 100%"><el-table-columnprop"key"l…

mac電腦生成文件下載URL

1.首先打開web共享&#xff0c;終端方式。 開始 sudo apachectl start 停止&#xff1a; sudo apachectl stop 重啟&#xff1a; sudo apachectl restart 2.將需要下載的文件 app.v1.6.12_note.apk /Library/WebServer/Documents/ 目錄下 3. 同一網絡下&#xff0c;直接用…

C++系列——————類和對象(上)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、面向對象的三大特征二、類的引入2.1類的定義 三.類的訪問限定符3.1訪問限定符的介紹3.2.訪問限定符的使用 四、類的作用域五、類的實例化六、類對象模型6.1…

JavaScript的內存管理機制

No.內容鏈接1Openlayers 【入門教程】 - 【源代碼示例300】 2Leaflet 【入門教程】 - 【源代碼圖文示例 150】 3Cesium 【入門教程】 - 【源代碼圖文示例200】 4MapboxGL【入門教程】 - 【源代碼圖文示例150】 5前端就業寶典 【面試題詳細答案 1000】 文章目錄 一、內存…

Pipecat: 創建語音對話agent的開源框架,支持多模態!

項目簡介 pipecat 是用于構建語音&#xff08;和多模態&#xff09;對話代理的框架。諸如私人教練、會議助理、兒童講故事玩具、客戶支持機器人、攝入流程和尖刻的社交伙伴。 看看一些示例應用&#xff1a; 語音代理入門 您可以開始在本地計算機上運行 Pipecat&#xff0c;然…