SpringBoot注解--10--@Bean,對象注入的三種方法

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • @Bean
    • 一、如何使用方法注解
        • 注意Bean 的命名規則,==當沒有設置 name 屬性時,那么 bean 默認的名稱就是方法名==,
        • 當設置了 name 屬性之后,只能通過==重命名的name 屬性對應的值來獲取==,也就是說重命名之后,再使用方法名就獲取不到 bean 對象;
    • 二、同一類型的對象注入多次的問題
      • 1、精準的描述bean的名稱(將注入的名稱寫對)
      • 2、使用@Resource設置name的方式來重命名注入的對象;
      • 3、使用@AutoWired+@Qualifier來篩選bean對象;
  • 對象注入的三種方法
    • 1、屬性注入
    • 2、構造方法注入
    • 3、Setter方法注入
    • 4. 屬性注入和構造方法注入以及 Setter 注入的區別是什么?


@Bean

一、如何使用方法注解

1、類注解是寫到類上面的,那么方法注解是寫到對應的方法上的;

    @Bean(name = "user1") public User getUser1() {User user = new User();user.setId(1);user.setName("張三");return user;}

2、方法注解的話是不能夠單獨使用的,如果我們只給一個方法注解@Bean的話,看是否能運行;

 ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");User user = context.getBean(User.class);//只使用類屬性System.out.println(user);

運行結果:
在這里插入圖片描述
如何解決?我們只需要在方法注解的類中添加一個類注解即可;
在這里插入圖片描述
再次運行:
在這里插入圖片描述

注意Bean 的命名規則,當沒有設置 name 屬性時,那么 bean 默認的名稱就是方法名
當設置了 name 屬性之后,只能通過重命名的name 屬性對應的值來獲取,也就是說重命名之后,再使用方法名就獲取不到 bean 對象;

比如已經給bean重命名了,我們在啟動類App中通過方法名來獲取Bean對象;
在這里插入圖片描述
看運行結果:

在這里插入圖片描述

二、同一類型的對象注入多次的問題

1、在UserBeans類中寫兩個對象注解;

@Component
public class UserBeans {@Bean(name = "user1") // 【注意事項:只使用一個 @Bean 是無法將對象存儲到容器中的】public User getUser1() {User user = new User();user.setId(1);user.setName("張三");return user;}@Bean(name = "user2") // 【注意事項:只使用一個 @Bean 是無法將對象存儲到容器中的】public User getUser2() {User user = new User();user.setId(2);user.setName("李四");return user;}

2、通過啟動類來獲取對象;

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean(User.class);//只使用類屬性
System.out.println(user);

在這里插入圖片描述
翻譯過來的意思就是:沒有可用的“com.User”類型的合格bean:應為單個匹配bean,但找到2:user1,user2;

那么,如何解決呢?這里我們提供了三種解決方案;

1、精準的描述bean的名稱(將注入的名稱寫對)

比如我們在啟動類中使用id+class的形式來取對象;

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean("user1",User.class);//只使用類屬性
System.out.println(user);

在這里插入圖片描述

2、使用@Resource設置name的方式來重命名注入的對象;

1、這里我們通過UserController類來進行演示;注意我們添加的注解@Resource,下面新寫了一個對象user1;

package com;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController {@Resourceprivate User user1;public void sayHi(){System.out.println("User"+user1);}
}

啟動類App中代碼:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController = context.getBean(UserController.class);
userController.sayHi();

在這里插入圖片描述

3、使用@AutoWired+@Qualifier來篩選bean對象;

UserController代碼:

package com;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController {@Autowired@Qualifier(value = "user2")private User user2;public void sayHi(){System.out.println("User"+user2);}
}

在這里插入圖片描述

對象注入的三種方法

1、屬性注入

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

package com;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
/*** 根據屬性實現 bean 對象的注入*/
@Controller
public class UserController2 {// 對象注入方式1:屬性注入@Autowiredprivate UserService userService;public void sayHi() {userService.sayHi();}}

啟動類App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2 = context.getBean(UserController2.class);
userController2.sayHi();

在這里插入圖片描述

2、構造方法注入

package com;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;/*** 使用構造方法實現 bean 注入*/
@Controller
public class UserController3 {private UserService userService;// 構造方法注入(官廣推薦寫法)@Autowiredpublic UserController3(UserService userService) {
//        userService = new UserService(); // 傳統的寫法this.userService = userService;}public void sayHi() {userService.sayHi();}}

注:如果當前類只存在一個構造方法,那么@Autowired注解可以省略;

啟動類App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController3 userController3 = context.getBean(UserController3.class);
userController3.sayHi();

在這里插入圖片描述

3、Setter方法注入

package com;import org.springframework.stereotype.Controller;import javax.annotation.Resource;/*** 使用 Setter 實現 bean 注入*/
@Controller
public class UserController4 {private UserService userService;@Resourcepublic void setUserService(UserService userService) {this.userService = userService;}public void sayHi() {userService.sayHi();}}

啟動類App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController4 userController4 = context.getBean(UserController4.class);
userController4.sayHi();

在這里插入圖片描述

4. 屬性注入和構造方法注入以及 Setter 注入的區別是什么?

  1. 屬性注入:特點寫法簡單。但是通用性不好,它只能運行在 IoC 容器下,如果是非 IOC 容器就會出現問題。
  2. Setter 注入:早期 Spring 版本推薦的寫法,Setter 注入通用性沒有構造方法注入通用。
  3. 構造方法注入: 通用性更好、它能確保在使用注入對象之前,此注入對象一定初始化過了。當構造方法注入參數過多時,此時開發者就要檢查自己所寫的代碼是否符合單一設計原則的規范了,此注入方式也是 spring后期版本中推薦的注入方式。

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

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

相關文章

解析Java中1000個常用類:Runnable 類,你學會了嗎?

在 Java 編程中,處理并發和多線程是一個重要的主題。為了簡化多線程編程,Java 提供了多種工具和類,其中最基本的一個工具就是 Runnable 接口。 Runnable 接口為創建和管理線程提供了一種標準的方式。本文將詳細介紹 Runnable 接口的定義、實現原理、應用場景,并通過示例展…

33【Aseprite 作圖】樹——拆解

1 樹葉 畫樹葉真累啊,可以先畫一個輪廓,細節一點點修 2 1 2 ;2 2 2 (橫著橫),這樣一點點畫樹葉 填充顏色,用了噴霧工具 2 樹干部分 輪廓部分,左邊的是3 3 3 ;上下都是…

網頁音頻提取在線工具有哪些 網頁音頻提取在線工具下載

別再到處去借會員賬號啦。教你一招,無視版權和地區限制,直接下載網頁中的音頻文件。沒有復雜的操作步驟,也不用學習任何代碼。只要是網頁中播放的音頻文件,都可以把它下載到本地保存。 一、網頁音頻提取在線工具有哪些 市面上的…

【數據結構】二叉樹:簡約和復雜的交織之美

專欄引入: 哈嘍大家好,我是野生的編程萌新,首先感謝大家的觀看。數據結構的學習者大多有這樣的想法:數據結構很重要,一定要學好,但數據結構比較抽象,有些算法理解起來很困難,學的很累…

Transformer中的位置編碼PE(position encoding)

Transformer中的位置編碼PE(position encoding) 1.提出背景 transformer模型的attention機制并沒有包含位置信息,即一句話中詞語在不同的位置時在transformer中是沒有區別的 2.解決背景 給encoder層和decoder層的輸入添加了一個額外的向量Positional Encoding&a…

平移數據c++

題目描述 將a數組中第一個元素移到數組末尾,其余數據依次往前平移一個位置。 輸入 第一行為數組a的元素個數n; 第二行為n個小于1000的正整數。 輸出 平移后的數組元素,每個數用一個空格隔開。 樣例輸入 10 1 2 3 4 5 6 7 8 9 10 樣例輸出 2 3 …

【專利 超音速】一種光伏檢測系統

申請號CN202410053901.0公開號(公開)CN118032774A申請日2024.01.12申請人(公開)超音速人工智能科技股份有限公司發明人(公開)張俊峰(總); 葉長春(總); 許春夏 摘要 本發明公開一種光伏檢測系統&#xff0…

iotdb時序庫在火電設備鍋爐場景下的實踐【原創文字,IoTDB社區可進行使用與傳播】

一.概述 1.1 說明 本文章主要介紹iotdb數據庫在電站鍋爐工業場景下,對輔助智能分析與預警的使用介紹。 【原創文字,IoTDB社區可進行使用與傳播】 1.2 項目背景 隨著人工智能算法在電力領域的發展,以及燃煤鍋爐設備精細化調整需求的增加&…

Java基礎八股

Java基礎八股 Java語言Java語言有什么特點Java與C區別Java如何實現跨平臺JVMvsJDKvsJRE標識符和關鍵字的區別是什么自增自減運算符移位運算符continue,break,return的區別是什么final,finally,finalize的區別final關鍵字的作用時什么 變量 Java語言 Java語言有什么特點 Java是…

LED燈編程:一步步探索光的魔法

LED燈編程:一步步探索光的魔法 在數字時代,LED燈早已超越了傳統的照明功能,成為編程與創意結合的完美載體。那么,LED燈怎么編程呢?本文將分四個方面、五個方面、六個方面和七個方面,帶您走進LED燈編程的奇…

如何在Python中管理內存

在Python中,內存管理主要是由解釋器自動處理的,這包括對象的分配和回收。Python使用引用計數和垃圾回收機制來管理內存,這大大簡化了開發者的工作,因為他們通常不需要手動管理內存。 然而,盡管Python自動管理內存&…

數據結構——經典鏈表OJ(二)

樂觀學習,樂觀生活,才能不斷前進啊!!! 我的主頁:optimistic_chen 我的專欄:c語言 點擊主頁:optimistic_chen和專欄:c語言, 創作不易,大佬們點贊鼓…

chatgpt之api的調用問題

1.調用api過程中,出現如下報錯內容 先寫一個測試樣例 import openaiopenai.api_key "OPEN_AI_KEY" openai.api_base"OPEN_AI_BASE_URL" # 是否需要base根據自己所在地區和key情況進行completion openai.ChatCompletion.create(model"g…

【intro】GNN中異構圖(heterogeneous graph)綜述

本篇博客內容是讀兩篇論文,兩篇論文連接如下: Heterogeneous graph neural networks analysis: a survey of techniques, evaluations and applications A Survey on Heterogeneous Graph Embedding: Methods, Techniques, Applications and Sources …

瓦羅蘭特國際服 外服游玩教程 瓦羅蘭特外服下載注冊游玩指南

瓦羅蘭特國際服 外服游玩教程 瓦羅蘭特外服下載注冊游玩指南 瓦羅蘭特作為當今游戲圈頂流的一款熱門FPS。游戲,作為拳頭游戲公司劃時代的一款游戲。游戲不僅延續了傳統FPS游戲的玩法,還添加許多新玩法,這也是游戲可以吸引大批量玩家的原因之…

Flink面試整理-對Flink的高級特性如CEP(復雜事件處理)、狀態后端選擇和調優等有所了解

Apache Flink 提供了一系列高級特性,使其成為一個強大的實時數據處理框架,特別適用于復雜的數據處理場景。其中,復雜事件處理(CEP)、狀態后端的選擇和調優是其中重要的幾個方面。 復雜事件處理(CEP) CEP 概念:CEP 是用于在數據流中識別復雜模式的技術。它允許用戶指定事…

基于電導增量MPPT控制算法的光伏發電系統simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 基于電導增量MPPT控制算法的光伏發電系統simulink建模與仿真。輸出MPPT跟蹤后的系統電流,電壓以及功率。 2.系統仿真結果 3.核心程序與模型 版本:MAT…

cocos creator 3.x實現手機虛擬操作桿

簡介 在許多移動游戲中,虛擬操縱桿是一個重要的用戶界面元素,用于控制角色或物體的移動。本文將介紹如何在Unity中實現虛擬操縱桿,提供了一段用于移動控制的代碼。我們將討論不同類型的虛擬操縱桿,如固定和跟隨,以及如…

Go常見語法題目解析

1、寫出下面代碼輸出內容。 package mainimport ("fmt" )func main() {defer_call() }func defer_call() {defer func() { fmt.Println("打印前") }()defer func() { fmt.Println("打印中") }()defer func() { fmt.Println("打印后")…

快速冪

a^b % q 給定整數 a b q, 求 a 的 b 次方 mod q 根據題目數字取值范圍,不能暴力處理。 會有兩個問題: 1、計算 a 的次方會超出范圍 2、不能循環 b 次計算 a 的乘積,會超時 處理問題1: 每計算一次 a 的乘積&#xf…