@Autowird 注解與存在多個相同類型對象的解方案

現有一個 Student 類,里面有兩個屬性,分別為 name 和 id;有一個 StuService 類,里面有兩個方法,返回值均為類型為 Student 的對象;還有一個 StuController 類,里面有一個 Student 類型的屬性,還有一個打印這個屬性的方法。代碼如下:

Student 類:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {private String name;private Integer id;
}

StuService 類:

@Service
public class StuService {@Beanpublic Student s1() {return new Student("zhangsan", 12);}@Beanpublic Student s2() {return new Student("lisi", 14);}
}

StuController 類:

@Controller
public class StuController {//屬性注入@Autowiredpublic Student student;public void print() {System.out.println(student);}
}

啟動類:

@SpringBootApplication
public class SpringBootDemo2025417Application {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(SpringBootDemo2025417Application.class, args);//獲取 StuController 對象StuController stuController = context.getBean(StuController.class);stuController.print();}}

代碼運行結果如下:

Description:Field student in com.gjm.demo.controller.StuController required a single bean, but 2 were found:- s1: defined by method 's1' in class path resource [com/gjm/demo/component/StuComponent.class]- s2: defined by method 's2' in class path resource [com/gjm/demo/component/StuComponent.class]

報錯了,錯誤信息里說只需要一個對象,但卻找到了兩個。這就是我們在 StuService 中定義的兩個方法,這兩個方法均返回了 Student 類型的對象,就會造成 Spring 不知道需要使用哪個對象完成屬性注入。

有三種解決方法,下面一一說明。

第一種方法,使用 @Qualifier 注解。在 @Autowired 注解上加上 @Qualifier 注解,表明需要注入的是哪個對象,代碼如下:

@Controller
public class StuController {//屬性注入@Qualifier("s1")@Autowiredpublic Student student;public void print() {System.out.println(student);}
}

在這里選擇了 s1 進行注入,運行結果如下:

結果顯示的是 s1 返回的對象,名為 zhangsan。

第二種解決方案為使用 @Resource 注解,代碼如下:

@Controller
public class StuController {@Resource(name = "s2")private Student student;public void print() {System.out.println(student);}
}

?在這里選擇 s2 進行注入,運行結果如下:

第三種解決方案就是使用 @Primary 注解,代碼如下:

@Service
public class StuService {@Primary@Beanpublic Student s1() {return new Student("zhangsan", 12);}@Beanpublic Student s2() {return new Student("lisi", 14);}
}

?@Primary 注解用途為將 s1 作為 Student 類的默認注入對象,這樣就會優先選擇 s1 進行屬性注入,運行結果如下:

補充

@Qualifier 在傳參的時候也可以指定默認的參數。現有下面代碼:

Student 類:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {private String name;private Integer id;
}

StuService 類:

@Service
public class StuService {@Beanpublic String name1() {return "zhangsan111";}@Beanpublic String name2() {return "zhangsan222";}@Beanpublic Student s1(String name) {return new Student(name, 12);}@Beanpublic Student s2() {return new Student("lisi", 14);}
}

StuController 類:

@Controller
public class StuController {@Resource(name = "s1")private Student student;public void print() {System.out.println(student);}
}

SpringBoot 啟動類:

@SpringBootApplication
public class SpringBootDemo2025417Application {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(SpringBootDemo2025417Application.class, args);//獲取 StuController 對象StuController stuController = context.getBean(StuController.class);stuController.print();}}

代碼運行結果如下:

Description:Parameter 0 of method s1 in com.gjm.demo.service.StuService required a single bean, but 2 were found:- name1: defined by method 'name1' in class path resource [com/gjm/demo/service/StuService.class]- name2: defined by method 'name2' in class path resource [com/gjm/demo/service/StuService.class]

報錯了,錯誤信息里說 s1 只需要一個參數,但卻找到了兩個。這時因為我們向 Spring 容器中注入了兩個類型為 String 的對象,當 Spring 為 String 類型的參數賦值時,會在 Spring 容器中查找類型為 String 的對象。現在容器中有兩個對象,Spring 不清楚到底需要使用哪一個。這時就需要我們手動指定 Spring 默認使用的參數了,即在參數前使用 @Qualiier 注解,代碼如下:

    @Beanpublic Student s1(@Qualifier("name1") String name) {return new Student(name, 12);}

這時 name 參數拿到的就是 name1 返回的結果了,運行結果如下:

@Autowired 與 @Resource 的區別?

1、@Autowired 是 Spring 框架提供的注解,@Resource 是 JDK 提供的注解;

2、@Autowired 是按照類型注入的,@Resource 是按照名稱注入的,@Resource 支持更多的參數設置。但嚴謹點說,@Resource 是按照類型 + 名稱注入的。

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

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

相關文章

黑馬商城項目(三)微服務

一、單體架構 測試高并發軟件 二、微服務 三、SpringCloud 四、微服務拆分 黑馬商城模塊: 服務拆分原則: 拆分服務: 獨立project: maven聚合: 拆分案例: 遠程調用: package com.hmall.cart.…

PyTorch:學習 CIFAR-10 分類

🔍 開始你的圖像分類之旅:一步一步學習 CIFAR-10 分類 圖像分類是計算機視覺中最基礎的任務之一,如果你是初學者,那么以 CIFAR-10 為訓練場是一個不錯的選擇。本文一步一步帶你從零開始,學習如何用深度學習模型實現圖…

3.學習筆記--Spring-AOP總結(p39)-Spring事務簡介(P40)-Spring事務角色(P41)-Spring事務屬性(P42)

1.AOP總結:面向切面編程,在不驚動原始基礎上為方法進行功能增強。 2.AOP核心概念: (1)代理:SpringAOP的核心是采用代理模式 (2)連接點:在SpringAOP中,理解為任…

數據庫-day06

一、實驗名稱和性質 分類查詢 驗證 綜合 設計 二、實驗目的 1.掌握數據查詢的Group by ; 2. 掌握聚集函數的使用方法。 三、實驗的軟硬件環境要求 硬件環境要求: PC機(單機) 使用的軟件名稱、版本號以及模塊: …

看門狗定時器(WDT)超時

一、問題 Arduino 程序使用<Ticker.h>包時&#xff0c;使用不當情況下&#xff0c;會導致“看門狗WDT超時” 1.1問題控制臺報錯 在串口監視器顯示 --------------- CUT HERE FOR EXCEPTION DECODER ---------------Soft WDT resetException (4): epc10x402077cb epc2…

AI在多Agent協同領域的核心概念、技術方法、應用場景及挑戰 的詳細解析

以下是 AI在多Agent協同領域的核心概念、技術方法、應用場景及挑戰 的詳細解析&#xff1a; 1. 多Agent協同的定義與核心目標 多Agent系統&#xff08;MAS, Multi-Agent System&#xff09;&#xff1a; 由多個獨立或協作的智能體&#xff08;Agent&#xff09;組成&#xff…

Wireshark TS | 異常 ACK 數據包處理

問題背景 來自于學習群里群友討論的一個數據包跟蹤文件&#xff0c;在其中涉及到兩處數據包異常現象&#xff0c;而產生這些現象的實際原因是數據包亂序。由于這兩處數據包異常&#xff0c;都有點特別&#xff0c;本篇也就其中一個異常現象單獨展開說明。 問題信息 數據包跟…

【React】項目的搭建

create-react-app 搭建vite 搭建相關下載 在Vue中搭建項目的步驟&#xff1a;1.首先安裝腳手架的環境&#xff0c;2.通過腳手架的指令創建項目 在React中有兩種方式去搭建項目&#xff1a;1.和Vue一樣&#xff0c;先安裝腳手架然后通過腳手架指令搭建&#xff1b;2.npx create-…

深入淺出 NVIDIA CUDA 架構與并行計算技術

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、CUDA為何重要&#xff1a;并行計算的時代 2、NVIDIA在…

pytorch學習02

自動微分 自動微分模塊torch.autograd負責自動計算張量操作的梯度&#xff0c;具有自動求導功能。自動微分模塊是構成神經網絡訓練的必要模塊&#xff0c;可以實現網絡權重參數的更新&#xff0c;使得反向傳播算法的實現變得簡單而高效。 1. 基礎概念 張量 Torch中一切皆為張…

Java虛擬機(JVM)平臺無關?相關?

計算機的概念模型 計算機實際上就是實現了一個圖靈機模型。即&#xff0c;輸入參數&#xff0c;根據程序計算&#xff0c;輸出結果。圖靈機模型如圖。 Tape是輸入數據&#xff0c;Program是針對這些數據進行計算的程序&#xff0c;中間橫著的方塊表示的是機器的狀態。 目前使…

satoken的奇奇怪怪的錯誤

發了 /user/getBrowseDetail和/user/getResponDetail&#xff0c;但為什么進入handle里面有三次&#xff1f;且第一次的handle類型是AbstractHandleMapping$PreFlightHttpRequestHandlerxxx,這一次進來的時候flag為false&#xff0c;StpUtils.checkLogin拋出了異常 第二次進來的…

【KWDB 創作者計劃】_上位機知識篇---SDK

文章目錄 前言一、SDK的核心組成API(應用程序接口)庫文件(Libraries)開發工具文檔與示例依賴項與環境配置二、SDK的作用簡化開發流程確保兼容性與穩定性加速產品迭代功能擴展與定制三、SDK的典型應用場景硬件設備開發操作系統與平臺云服務與API集成游戲與圖形開發四、SDK與…

golang處理時間的包time一次性全面了解

本文旨在對官方time包有個全面學習了解。不鉆摳細節&#xff0c;但又有全面了解&#xff0c;重點介紹常用的內容&#xff0c;一些低頻的可能這輩子可能都用不上。主打一個花最少時間辦最大事。 Duration對象: 兩個time實例經過的時間,以長度為int64的納秒來計數。 常見的durati…

PyCharm Flask 使用 Tailwind CSS 配置

使用 Tailwind CSS 步驟 1&#xff1a;初始化項目 在 PyCharm 終端運行&#xff1a;npm init -y安裝 Tailwind CSS&#xff1a;npm install -D tailwindcss postcss autoprefixer初始化 Tailwind 配置文件&#xff1a;npx tailwindcss init這會生成 tailwind.config.js。 步…

【英語語法】基本句型

目錄 前言一&#xff1a;主謂二&#xff1a;主謂賓三&#xff1a;主系表四&#xff1a;主謂雙賓五&#xff1a;主謂賓補 前言 英語基本句型是語法體系的基石&#xff0c;以下是英語五大基本句型。 一&#xff1a;主謂 結構&#xff1a;主語 不及物動詞 例句&#xff1a; T…

隔離DCDC輔助電源解決方案與產品應用科普

**“隔離”與“非隔離的區別** 隔離&#xff1a; 1、AC-DC&#xff0c;也叫“一次電源”&#xff0c;人可能會碰到的應用場合&#xff0c;起安全保護作用&#xff1b; 2、為了抗干擾&#xff0c;通過隔離能有效隔絕干擾信號傳輸。 非隔離&#xff1a; 1、“安全特低電壓&#…

DS-SLAM 運動一致性檢測的源碼解讀

運動一致性檢測是Frame.cc的Frame::ProcessMovingObject(const cv::Mat &imgray)函數。 對應DS-SLAM流程圖Moving consistency check的部分 把這個函數單獨摘出來&#xff0c;寫了一下對兩幀檢測&#xff0c;查看效果的程序&#xff1a; #include <opencv2/opencv.hpp…

安全測試的全面知識體系及實現路徑

以下是安全測試的全面知識體系及實現路徑,結合最新工具和技術趨勢(截至2025年): 一、安全測試核心類型與工具 1. 靜態應用安全測試(SAST) 知識點: 通過分析源代碼、字節碼或二進制文件識別漏洞(如SQL注入、緩沖區溢出)支持早期漏洞發現,減少修復成本,適合白盒測試場…

GPT-4o Image Generation Capabilities: An Empirical Study

GPT-4o 圖像生成能力:一項實證研究 目錄 介紹研究背景方法論文本到圖像生成圖像到圖像轉換圖像到 3D 能力主要優勢局限性與挑戰對比性能影響與未來方向結論介紹 近年來,圖像生成領域發生了巨大的變化,從生成對抗網絡 (GAN) 發展到擴散模型,再到可以處理多種模態的統一生成架…