Java【Spring】使用注解, 更簡單的存儲和獲取 Bean

文章目錄

  • 前言
  • 一、存儲 Bean
    • 1, 配置文件
    • 2, 五大類注解
      • Bean 的命名規則
    • 3, 方法注解
      • Bean 的命名規則
  • 二、獲取 Bean
    • 1, 屬性注入
    • 2, Setter 注入
    • 3, 構造方法注入
    • 4, @Autowired 和 @Resource 的區別
    • 5, 同一個類型的多個 Bean 注入問題
  • 總結


前言

各位讀者好, 我是小陳, 這是我的個人主頁, 希望我的專欄能夠幫助到你:
📕 JavaSE基礎: 基礎語法, 類和對象, 封裝繼承多態, 接口, 綜合小練習圖書管理系統等
📗 Java數據結構: 順序表, 鏈表, 堆, 二叉樹, 二叉搜索樹, 哈希表等
📘 JavaEE初階: 多線程, 網絡編程, TCP/IP協議, HTTP協議, Tomcat, Servlet, Linux, JVM等(正在持續更新)

Spring 中有很多注解, 來幫助我們更加方便, 高效的編寫代碼, 本篇介紹存儲和獲取 Bean 時使用到的注解
在這里插入圖片描述


提示:是正在努力進步的小菜鳥一只,如有大佬發現文章欠佳之處歡迎批評指點~ 廢話不多說,直接上干貨!

一、存儲 Bean

上篇文章 介紹了基本的存儲和獲取 Bean 的方式, 如果按照上篇文章介紹的方式存儲Bean, 那么每存儲一個 Bean 就需要在配置文件中寫一行標簽, 十分麻煩, 其實有一種更方便的方式, 我們可以配置存儲對象的掃描包路徑, 只有被配置的包下的所有類, 并且添加了注解 才能被正確的識別并保存到 Spring 中

1, 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com"></content:component-scan>
</beans>
  • resources 目錄下新建一個 .xml 文件, 把上述代碼拷貝到其中
    在這里插入圖片描述
    指定了要掃描的包之后, 只有這個包, 以及這個包下面的子包中的代碼, 添加了注解之后才能生效

2, 五大類注解

類注解(加在類上的注解)有五個:@Controller、@Service、@Repository、@Component、@Configuration

  • 使用 @Controller, 新建一個 UserController 類
    在這里插入圖片描述

  • 使用 @Service, 新建一個 UserService 類
    在這里插入圖片描述

  • 使用 @Repository, 新建一個 UserRepository 類
    在這里插入圖片描述

  • 使用 @Component, 新建一個 UserComponent 類
    在這里插入圖片描述

  • 使用 @Configuration, 新建一個 UserConfiguration 類
    在這里插入圖片描述

  • 在啟動類中使用 ApplicationContext 獲取上下文對象, 使用 getBean 方法獲取并使用剛剛存儲的五個 Bean
    在這里插入圖片描述

  • 觀察執行結果, 是否都成功的存儲了
    在這里插入圖片描述


綜上, 使用這五個類注解確實可以更方便的存儲 Bean, 不需要再每存儲一個就寫一行配置標簽, 那為什么要有五個呢? 一個不夠嗎? 這些注解有什么作用?

這五個注解分別標識了不同的作用, 看到這個注解就知道這個類是用來干什么的 :
@Controller 標識了業務邏輯層
@Service 標識了服務層
@Repository 標識了持久層
@Component 標識了組件層
@Configuration 標識了配置層

以下是阿里的工程分層調用流程 :

在這里插入圖片描述

在真實的項目中也是需要按照大致的流程來分層管理代碼模塊


Bean 的命名規則

我們只是在配置文件中指定了要掃描的包路徑, 并沒有指定要存儲的 Bean 的名稱, 那憑什么根據下面代碼中標出的這些命名就能正確找到 Bean 呢?

在這里插入圖片描述

  • 默認情況下, Bean 的名稱就是類名的小駝峰形式, 比如 : 類名是 UserController, Bean 的名稱默認就是 userController

  • 但是!!! 如果類名的第一個字母和第二個字母都是大寫, 比如: ABC, 那么 Bean 的名稱就是 ABC(原類名) 而不是 aBC
    在這里插入圖片描述
    如果 Bean 的名稱是 aBC 無法存儲
    在這里插入圖片描述
    如果 Bean 的名稱是 ABC 可以存儲
    在這里插入圖片描述

所以只有 不滿足類名的前兩個字母都是大寫 的情況下, Bean 的默認命名是小駝峰形式, 否則就是原類名

當然也可以手動命名, 這些類注解都可以設置一個 Value 參數, 如圖 :
在這里插入圖片描述
在這里插入圖片描述


3, 方法注解

方法注解 @Bean 是修飾在一個方法上, 那怎么能存儲 Bean(類對象) 呢? 其實是把方法最終返回的對象存儲起來, 且 @Bean 必須搭配五大類注解之一使用, 且一定要有返回值

  • 先定義一個 User 類
    -
  • 使用 @Bean 存儲方法最終返回的 Bean 對象在這里插入圖片描述
  • 獲取并使用 Bean
    在這里插入圖片描述

Bean 的命名規則

  • 使用方法注解存儲的 Bean, 默認名稱就是 @Bean 注解所加的方法名而不再是類名, (一個類中可能有多個方法需要使用 @Bean, 如果仍然使用類名作為默認命名, 可能多個 Bean 會重名)

  • 也可以給 @Bean 注解傳遞參數來設定名字, 甚至可以設置一個數組, 其中包含多個名字
    在這里插入圖片描述
    獲取 Bean 對象時使用這兩個名字都可以
    在這里插入圖片描述

  • 如果多個 @Bean 注解命名相同, 只有一個 Bean 能被存儲
    在這里插入圖片描述
    在這里插入圖片描述

如果多個 @Bean 使用相同的名稱, 例如上述 : 喜羊羊這個 Bean 先被加載, 所以先使用了 user 這個名字, 美羊羊這個 Bean 后被加載, 也想用 user 這個名字, 卻被檢查到 user 這個名字已經有人用了, 就不存儲美羊羊這個 Bean 了

在 @Bean 中重命名之后, 就不能使用默認的命名了


二、獲取 Bean

獲取 Bean 對象也叫對象裝配, 是把對象取出來放到某個類中,有時候也叫對象注?

對象注入有三種方式 : 屬性注入, Setter 注入, 構造方法注入, 都是使用 @Autowired 注解來實現

按照實際開發的模式, 將 Repository 類注入到 Service 類中, Repository 類的實現如下:

在這里插入圖片描述

當前代碼以及接下來的代碼都會放在dome4這個包下面, 配置文件中也要設置這個包的掃描路徑


1, 屬性注入

這是開發中最常用的方式, 因為代碼簡潔方便
在這里插入圖片描述
加了 @Autowired 注解 之后, 就會將已經存儲過的 UserRepository 這個類型的 Bean 注入進來

通過屬性注入的方式, 就可以獲取到這個 Bean 并使用它的方法


2, Setter 注入

在這里插入圖片描述


3, 構造方法注入

構造方法注入是 Spring 推薦的方式
在這里插入圖片描述

構造方法注入更符合單一設計的原則, 因為構造方法只會隨著類的加載而調用一次, 不會被任意修改和調用, 也可以保證在使用這個被注入的對象時能被完全初始化, 也可以注入被 final 修飾的變量


4, @Autowired 和 @Resource 的區別

@Autowired 注解也可以被 @Resource 注解代替, 區別如下 :

  • 出身不同:@Autowired 來自于 Spring,而 @Resource 來自于 JDK 的注解;
  • 使?時設置的參數不同:相比于 @Autowired 來說,@Resource 支持更多的參數設置,例如 name 設置,根據名稱獲取 Bean。
  • @Autowired 可用于 Setter 注入、構造函數注入和屬性注入,而 @Resource ,不能?于構造函數注入

5, 同一個類型的多個 Bean 注入問題

  • 先定義一個 User 類, 提供 setter 和 toString 方法
    在這里插入圖片描述
  • 在 Users 類中使用方法注解存儲兩個類型為 User 的 Bean, 并設置屬性的值在這里插入圖片描述
  • 在 Service 層注入 User, 查看 User 的值
    在這里插入圖片描述
  • 在 APP 啟動類中調用 showUser 這個方法, 觀察結果
    在這里插入圖片描述

程序執行的結果一定是報錯, 因為我們存儲了兩個類型為 User 的 Bean , 在使用 @Autowired 注入時, 是首先根據 User 這個類型進行匹配, 發現找到了兩個 Bean , 于是程序就不能確定到底要注入哪一個了
在這里插入圖片描述

@Autowired 注入時, 首先根據類型進行匹配, 如果多個 Bean 類型相同, 再根據 Bean 的名稱進行注入

  • 解決方案一 : 存儲 Bean 時設置好名稱, 注入時再明確指定名稱
    在這里插入圖片描述在這里插入圖片描述
  • 解決方案二 : 使用 @Autowired 搭配 @Qualifier 注解指定注入的 Bean 的名稱
    在這里插入圖片描述

這個 @Qualifier 注解更像是加了一層篩選操作

  • 解決方案三 : 使用 @Resource 注解指定 name
    在這里插入圖片描述
    在這里插入圖片描述

使用上述任意三種方式都可以正確的拿到想要的 Bean :
在這里插入圖片描述


總結

以上就是本篇的所有內容了:

  • 使用 @Controller、@Service、@Repository、@Component、@Configuration 這五大類注解可以存儲 Bean, 在注解中設置一個 Value 參數對 Bean 重命名
  • 使用 @Bean 這個方法注解并搭配任意一個類注解可以將返回值作為 Bean 存儲, 在注解中可以指定一個或多個字符串對 Bean 重命名
  • 使用 @Autowired 可以進行屬性注入, setter 注入, 構造方法注入, 實現方便的獲取 Bean

如果本篇對你有幫助,請點贊收藏支持一下,小手一抖就是對作者莫大的鼓勵啦😋😋😋~


上山總比下山辛苦
下篇文章見
在這里插入圖片描述

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

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

相關文章

【網絡基礎實戰之路】實現RIP協議與OSPF協議間路由交流的實戰詳解

系列文章傳送門&#xff1a; 【網絡基礎實戰之路】設計網絡劃分的實戰詳解 【網絡基礎實戰之路】一文弄懂TCP的三次握手與四次斷開 【網絡基礎實戰之路】基于MGRE多點協議的實戰詳解 【網絡基礎實戰之路】基于OSPF協議建立兩個MGRE網絡的實驗詳解 PS&#xff1a;本要求基于…

FreeRTOS(任務通知)

資料來源于硬件家園&#xff1a;資料匯總 - FreeRTOS實時操作系統課程(多任務管理) 目錄 一、任務通知的概念 1、概念 2、發送通知給任務的方式 3、任務通知使用限制 二、任務通知的運行機制 三、任務通知的API函數 1、任務通知的數據結構 2、常用的API函數 3、函數x…

opencv實戰項目 手勢識別-實現尺寸縮放效果

手勢識別系列文章目錄 手勢識別是一種人機交互技術&#xff0c;通過識別人的手勢動作&#xff0c;從而實現對計算機、智能手機、智能電視等設備的操作和控制。 1. opencv實現手部追蹤&#xff08;定位手部關鍵點&#xff09; 2.opencv實戰項目 實現手勢跟蹤并返回位置信息&…

Linux elasticsearch設置為開機自啟動服務

Linux elasticsearch怎么設置為設置為開機自啟動服務 1、進入/etc/init.d目錄 cd /etc/init.d 2、新建文件elasticsearch&#xff0c;注意&#xff0c;沒有擴展名 vi elasticsearch 3、新建文件elasticsearch的內容如下 說明&#xff1a; &#xff08;1&#xff09;“su…

基于低代碼和數字孿生技術的電力運維平臺設計

電力能源服務商在為用能企業提供線上服務的時候&#xff0c;不可避免要面對用能企業的各種個性化需求。如果這些需求和想法都要靠平臺廠家研發人員來實現&#xff0c;那在周期、成本、效果上都將是無法滿足服務運營需要的&#xff0c;這也是目前很多線上能源云平臺應用效果不理…

【狀態模式】拯救if-else堆出來的屎山代碼

前言 我想大家平時都在開發重都遇見過屎山代碼&#xff0c;這些屎山代碼一般都是由于復雜且龐大的if-else造成的&#xff0c;狀態模式&#xff0c;是一種很好的優化屎山代碼的設計模式&#xff0c;本文將采用兩個業務場景的示例來講解如何使用狀態模式拯救屎山代碼。 目錄 前…

【Axure高保真原型】通過輸入框動態控制環形圖

今天和大家分享通過輸入框動態控制環形圖的原型模板&#xff0c;在輸入框里維護項目數據&#xff0c;可以自動生成對應的環形圖&#xff0c;鼠標移入對應扇形&#xff0c;可以查看對應數據。使用也非常方便&#xff0c;只需要修改輸入框里的數據&#xff0c;或者復制粘貼文本&a…

簡單記錄牛客top101算法題(初級題C語言實現)BM17 二分查找 BM21 旋轉數組的最小數字 BM23 二叉樹的前序遍歷

1. BM17 二分查找 要求&#xff1a;給定一個 元素升序的、無重復數字的整型數組 nums 和一個目標值 target &#xff0c;寫一個函數搜索 nums 中的 target&#xff0c;如果目標值存在返回下標&#xff08;下標從 0 開始&#xff09;&#xff0c;否則返回 -1。 輸入&#xff1a…

【云原生】K8S存儲卷:PV、PVC詳解

目錄 一、emptyDir存儲卷二、hostPath存儲卷三、nfs共享存儲卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2創建動態PV 一、emptyDir存儲卷 容器磁盤上的文件的生命周期是短暫的&#xff0c;這就使得在容器中運行重要應用時會出現一些問題。首先&#xff0c;當容器崩潰時&#xff0c;ku…

UG NX二次開發(C++)-PK函數創建一條圓弧曲線

文章目錄 1、前言2、創建一個項目3、添加頭文件4、在do_it中添加創建圓曲線的源代碼5、調用dll6、再創建一個長方體驗證1、前言 采用PK進行UG NX二次開發,現在看到的文章很多是直接創建實體,然后在UG NX的視圖區顯示出來,對于創建圓曲線的文章不多,本文講一下PK函數創建圓…

Java基礎篇--日期時間類

目錄 前言 Instant&#xff08;時間戳&#xff09;類 LocalData(日期)類 LocalTime(時間)類 LocalDataTime(日期時間)類 Duration(時間間隔)類 Period(日期間隔)類 Clock&#xff08;獲取時區&#xff09;類 前言 在開發中經常需要處理日期和時間&#xff0c;Java提供…

Git 代碼分支規范

目的 俗話說&#xff1a;沒有規矩&#xff0c;不成方圓。遵循一個好的規章制度能讓你的工作事半功倍。同時也可以展現出你做事的認真的態度以及你的專業性&#xff0c;不會顯得雜亂無章&#xff0c;管理困難。Git分支規范也是一樣。當遵循了某種約定的Git分支&#xff0c;在代…

若依框架淺淺介紹

由若依官網所給介紹可知 1、文件結構介紹 在ruoyi-admin的pom.xml文件中引入了ruoyi-framework、ruoyi-quartz和ruoyi-generatior模塊&#xff0c;在ruoyi-framework的pom.xml文件中引入了ruoyi-system模塊。 2、技術棧介紹 前端&#xff1a;Vue、Element UI后端&#xff1a…

Redis持久化機制簡介

當涉及到Redis的持久化時&#xff0c;有兩種主要的持久化方式&#xff1a;RDB&#xff08;Redis Database&#xff09;快照和AOF&#xff08;Append-Only File&#xff09;日志。這些方式可以根據需求的不同&#xff0c;選擇適合的策略。 RDB&#xff08;Redis Database&#…

第1章:緒論

科學、技術、工程、應用 科學&#xff1a;是什么、為什么技術&#xff1a;怎么做工程&#xff1a;怎樣做的多快好省應用&#xff1a;怎么使用 定義 機器學習&#xff1a;利用經驗改善系統自身的性能。 研究 智能數據分析&#xff08;數據分析算法&#xff09; 典型的機器…

電腦ip地址怎么改 ip地址怎么改到別的城市

一、ip地址怎么改到別的城市 1.ip地址怎么改到別的城市&#xff0c;1、重啟WIFI路由設備 一般手機或電腦在家或公司上網時都是接入到路由器的WIFI網絡,再由路由器分配上網IP地址,如果要更換上網IP那么重啟路由器設備后,路由器會向網絡運營商進行寬帶的重新撥號,此時手機或電腦設…

【【verilog 典型電路設計之加法器樹乘法器】】

verilog 典型電路設計之加法器樹乘法器 加法器樹乘法器 加法器樹乘法器的設計思想是“移位后加”&#xff0c;并且加法運算采用加法器樹的形式。乘法運算的過程是&#xff0c;被乘數與乘數的每一位相乘并且乘以相應的權值&#xff0c;最后將所得的結果相加&#xff0c;便得到了…

mongodb:環境搭建

mongodb 是什么&#xff1f; MongoDB是一款為web應用程序和互聯網基礎設施設計的數據庫管理系統。沒錯MongoDB就是數據庫&#xff0c;是NoSQL類型的數據庫 為什么要用mongodb&#xff1f; &#xff08;1&#xff09;MongoDB提出的是文檔、集合的概念&#xff0c;使用BSON&am…

【Go】常見的四個內存泄漏問題

Goroutine沒有順利結束 1、這里更多的是由于channelforselect導致的&#xff0c;錯誤的寫法導致了發送者或接收者沒有發現channel已經關閉&#xff0c;任務已經結束了&#xff0c;卻仍然在嘗試輸入輸出https://geektutu.com/post/hpg-exit-goroutine.html Map的remove方法不會…

selenium.webdriver Python爬蟲教程

文章目錄 selenium安裝和使用 selenium安裝和使用 pip install selenium 下載對應的瀏覽器驅動 實例化瀏覽器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制瀏覽器