Spring系統學習 -Spring IOC 的XML管理Bean之bean的獲取、依賴注入值的方式

在Spring框架中,XML配置是最傳統和最常見的方式之一,用于管理Bean的創建、依賴注入和生命周期等。這個在Spring中我們使用算是常用的,我們需要根據Spring的基于XML管理Bean了解相關Spring中常用的獲取bean的方式、依賴注入值的幾種方式等等。

基于XML方式管理bean的流程

  1. 創建XML配置文件:創建一個XML文件,用于定義Bean的配置信息和依賴關系。可以使用任何文本編輯器創建該文件,通常將其命名為"beans.xml"。
  2. 聲明XML命名空間和模式位置:在XML文件的根元素中,聲明Spring的命名空間和模式位置,以便正確解析和驗證XML配置。
       <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
    
  3. 定義Bean:使用元素來定義Bean,指定Bean的ID、類名和其他屬性。示例如下:
    <bean id="userService" class="com.example.UserService"><property name="userDao" ref="userDao"/>
    </bean><bean id="userDao" class="com.example.UserDao"/>
    
  4. 加載XML配置文件:在Java代碼中,使用ApplicationContext來加載XML配置文件。示例如下:
    public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");}
    }
    
  5. 獲取Bean:通過ApplicationContext的getBean()方法,從容器中獲取所需的Bean實例。示例如下:
    UserService userService = (UserService) context.getBean("userService");
    

搭建Spring模塊結構

創建基本模塊并引入相關配置

創建Spring模塊
在這里插入圖片描述
Spring 6 開始已經不在支持javaJDK 8了。

在pom.xml文件中引入相關依賴:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--        引入Spring 依賴  5 的版本才支持 jdk8 , 6已經不在支持JDK8了--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--        引入阿里巴巴的數據庫鏈接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.5</version></dependency>

創建一個類HelloWorld

public class HelloWorld {public void sayHello(){System.out.println("Hello World!");}
}

創建一個Spring配置文件
在這里插入圖片描述
存放到resources目錄下
在這里插入圖片描述
之后我們在創建的配置文件中配置Bean:

<!--配置HelloWorld所對應的bean,即將HelloWorld的對象交給Spring的IOC容器管理通過bean標簽配置IOC容器所管理的bean屬性:id:設置bean的唯一標識class:設置bean所對應類型的全類名
-->
<bean id="helloworld" class="com.miaow.spring.bean.HelloWorld"></bean>

接下來我們創建一個測試類

@Test
public void testHelloWorld(){ApplicationContext ac = newClassPathXmlApplicationContext("applicationContext.xml");HelloWorld helloworld = (HelloWorld) ac.getBean("helloworld");helloworld.sayHello();
}

然后我們測試看一下是否輸出正常。
在這里插入圖片描述

大致流程
在這里插入圖片描述
ps:Spring 底層默認通過反射技術調用組件類的無參構造器來創建組件對象,這一點需要注意。如果在需要無參構造器時,沒有無參構造器,則會拋出下面的異常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘helloworld’ defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.miaow.spring.bean.HelloWorld]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.miaow.spring.bean.HelloWorld.

獲取Bean

根據ID獲取

由于 id 屬性指定了 bean 的唯一標識,所以根據 bean 標簽的 id 屬性可以精確獲取到一個組件對象。
上述例子就是根據id獲取一個組件對象。

public void testHelloWorld(){ApplicationContext ac = newClassPathXmlApplicationContext("applicationContext.xml");//這個helloworld就是我們在xml配置文件設置的<bean id = "helloworld" >HelloWorld helloworld = (HelloWorld) ac.getBean("helloworld");helloworld.sayHello();
}
根據類型獲取
@Test
public void testHelloWorld(){ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");HelloWorld bean = ac.getBean(HelloWorld.class);bean.sayHello();
}
根據id和類型獲取
@Test
public void testHelloWorld(){ApplicationContext ac = newClassPathXmlApplicationContext("applicationContext.xml");HelloWorld bean = ac.getBean("helloworld", HelloWorld.class);bean.sayHello();
}

當根據類型獲取bean時,要求IOC容器中指定類型的bean有且只能有一個

例如:

<bean id="helloworldOne" class="com.miaow.spring.bean.HelloWorld"></bean>
<bean id="helloworldTwo" class="com.miaow.spring.bean.HelloWorld"></bean>

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ‘com.miaow.spring.bean.HelloWorld’ available: expected single matching bean but found 2: helloworldOne,helloworldTwo

  • 如果組件類實現了接口,根據接口類型可以獲取 bean 嗎?

    可以,前提是bean唯一

  • 如果一個接口有多個實現類,這些實現類都配置了 bean,根據接口類型可以獲取 bean 嗎?

    不行,因為bean不唯一

根據類型來獲取bean時,在滿足bean唯一性的前提下,其實只是看:『對象 instanceof 指定的類型』的返回結果,只要返回的是true就可以認定為和類型匹配,能夠獲取到。

Spring依賴注入的方式

Spring的IoC(控制反轉)容器通過依賴注入(DI)來管理應用程序中的組件之間的依賴關系。依賴注入是指將一個對象的依賴關系傳遞給另一個對象,而不是由被依賴對象自己創建或管理依賴對象。Spring框架提供了多種方式來實現依賴注入,包括構造器注入、Setter方法注入、字段注入、注解注入等。
至于字段注入和注解注入我們到Spring注解的時候再繼續講解,這里了解即可。

我們來創建一個學生實體類:

public class Student {private Integer id;private String name;private Integer age;private String sex;public Student() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}
}
setter注入

我們通過Setter方式給上述的Student實體類注入相關值:

我們新建一個springdi.xml配置文件,然后在其中添加如下代碼:

<bean id="studentOne" class="com.miaow.spring.bean.Student"><!-- property標簽:通過組件類的setXxx()方法給組件對象設置屬性 --><!-- name屬性:指定屬性名(這個屬性名是getXxx()、setXxx()方法定義的,和成員變量無關)--><!-- value屬性:指定屬性值 --><property name="id" value="1001"></property><property name="name" value="張三"></property><property name="age" value="23"></property><property name="sex" value=""></property>
</bean>

接下來我們在測試類方法中測試

@Test
public void testDIBySet(){ApplicationContext ac = new ClassPathXmlApplicationContext("springdi.xml");Student studentOne = ac.getBean("studentOne", Student.class);System.out.println(studentOne);
}
構造器注入

通過構造器注入將依賴項傳遞給bean
在實體類Student實體類中添加:

public Student(Integer id, String name, Integer age, String sex) {this.id = id;this.name = name;this.age = age;this.sex = sex;
}

之后我們在springdi.xml文件中配置:

<bean id="studentTwo" class="com.miaow.spring.bean.Student"><constructor-arg value="1002"></constructor-arg><constructor-arg value="李四"></constructor-arg><constructor-arg value="33"></constructor-arg><constructor-arg value=""></constructor-arg>
</bean>

注意:
constructor-arg標簽還有兩個屬性可以進一步描述構造器參數:

  • index屬性:指定參數所在位置的索引(從0開始)
  • name屬性:指定參數名

測試類中進行測試:

@Test
public void testDIBySet(){ApplicationContext ac = new ClassPathXmlApplicationContext("springdi.xml");Student studentOne = ac.getBean("studentTwo", Student.class);System.out.println(studentOne);
}

特殊值處理賦值

字面符

關于特殊值處理賦值,我們需要事先了解字面符。

什么是字面符?
int a = 10;


聲明一個變量a,初始化為10,此時a就不代表字母a了,而是作為一個變量的名字。當我們引用a的時候,我們實際上拿到的值是10。


而如果a是帶引號的:‘a’,那么它現在不是一個變量,它就是代表a這個字母本身,這就是字面量。所以字面量沒有引申含義,就是我們看到的這個數據本身。

例如

<!-- 使用value屬性給bean的屬性賦值時,Spring會把value屬性的值看做字面量 -->
<property name="name" value="張三"/>
NULL
<!--表示name的值為空值-->
<property name="name"><null />
</property><!--寫法同-->
<property name="name" value="null"></property>
<(小于) — XML實體

由于在XML中無法直接使用,故而我們需要用XML實體來代替

<property name="expression" value="a &lt; b"/>
CDARA節
<property name="expression"><!-- 解決方案二:使用CDATA節 --><!-- CDATA中的C代表Character,是文本、字符的含義,CDATA就表示純文本數據 --><!-- XML解析器看到CDATA節就知道這里是純文本,就不會當作XML標簽或屬性來解析 --><!-- 所以CDATA節中寫什么符號都隨意 --><value><![CDATA[a < b]]></value>
</property>

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

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

相關文章

c++ namespace以及使用建議

命名空間就是用來區分你使用的這個變量和函數是屬于那一塊的。用來防止不同的人所寫函數和變量&#xff0c;名字相同產生沖突。 在寫c代碼的時候&#xff0c;經常會使用標準庫中的函數&#xff0c;使用之前我們必須在前面添加一個std::&#xff0c;因為c標準庫的函數是在命名空…

關閉Cloudflare Pages的訪問策略

curl API 獲取相應的 uid curl -X GET "https://api.cloudflare.com/client/v4/accounts/賬戶標識符/access/apps" \-H "X-Auth-Email: 郵箱" \-H "X-Auth-Key: Global API KEY" \-H "Content-Type: application/json"賬戶標識符是登…

Dubbo面試題甄選及參考答案

目錄 Dubbo是什么? Dubbo的主要使用場景有哪些? Dubbo的核心功能有哪些? Dubbo與Spring框架的集成方式是什么? Dubbo的RPC調用原理是什么? Dubbo的架構中包含哪些核心組件? Provider、Consumer、Registry、Monitor在Dubbo中分別承擔什么角色? Container在Dubbo中…

Maven項目打包成jar項目后運行報錯誤: 找不到或無法加載主類 Main.Main 和 jar中沒有主清單屬性解決方案

已經用maven工程的package功能進行了打包 找不到或無法加載主類 Main.Main 規定主類 主要在maven的配置文件當中 這邊一定要綁定自己的啟動類 jar中沒有主清單屬性 刪掉這一行就行哈 正確的插件代碼 <plugin><groupId>org.springframework.boot</groupId&…

毫米波SDK使用1

本文檔是AM273x等毫米波雷達處理器SDK的配置和使用&#xff0c;主要參考TI的官方文檔《mmwave mcuplus sdk user guide》。這里僅摘取其中重要的部分&#xff0c;其余枝節可參考原文。 2 系統概覽 mmWave SDK分為兩個主要組件:mmWave套件和mmWave演示。 2.1. mmWave套件 mmWa…

AXI Quad SPI IP核基于AXI-Lite接口的標準SPI設計指南

在標準SPI配置下&#xff0c;SPI設備除了包含基本的SPI特性外&#xff0c;還具備以下一些標準功能&#xff0c;這些功能如下所示&#xff1a; 支持FPGA內部的多主設備配置&#xff0c;其中使用單獨的_I&#xff08;輸入&#xff09;、_O&#xff08;輸出&#xff09;、_T&…

FM148A,FM146B運行備件

FM148A,FM146B運行備件。電源保險絲倉主控底座的保險絲倉示意圖底座上共有兩個保險絲&#xff08;800mA&#xff09;&#xff0c;FM148A,FM146B運行備件。&#xff08;10&#xff5e;73&#xff09;30/195主控單元2.K-CUT014槽底座地址接口主控站地址撥開關從上到下為二進制數的…

開發網站,如何給上傳圖片的服務器目錄授權

開發網站&#xff0c;上傳圖像時提示”上傳圖片失敗&#xff0c;Impossible to create the root directory /var/www/html/xxxxx/public/uploads/avatar/20240608.“ 在Ubuntu上&#xff0c;你可以通過調整文件夾權限來解決這個問題。首先&#xff0c;確保Web服務器&#xff08…

【筆記】從零開始做一個精靈龍女-裝備階段

這里只記錄相對重要的步驟和一些思路 但是頭發那塊很詳細哦~ &#xff08;標的小數字不用在意&#xff0c;那個是我網課的時長記錄&#xff09; 耳環 1.創建一個圓環&#xff0c;調整參數 做好后再復制一個小的 肩甲 2.0-2.4 1.創建圓柱體/球體也可 然后把底部的兩個點刪…

在 Unreal Engine 5.4 中加載 5.3 版本的插件

Unreal Engine 的版本更新可能導致插件的兼容性問題。如果你需要在 Unreal Engine 5.4 中加載 5.3 版本的插件&#xff0c;可能需要進行一些手動調整和重新編譯。本文將詳細介紹如何進行這些操作。 步驟 1: 準備插件文件 下載 5.3 版本的插件&#xff1a; 從官方源或插件開發者…

Xsens動作捕捉系統:角色動畫制作與運動分析領域的先進工具

隨著傳感器技術的不斷進步&#xff0c;動作捕捉技術現在更加趨向于民用化&#xff0c;擁有價格優勢的慣性動作捕捉系統現在更多的出現在獨立動畫工作室與國內外多所高校的實際項目應用中。 憑借無場地限制、價格優惠、校準使用方便、數據采集精確等多項優勢&#xff0c;Xsens慣…

[AI Google] 雙子座模型家族迎來新突破:更快的模型、更長的上下文、AI代理等更多功能

Google發布了Gemini模型家族的更新&#xff0c;包括新的1.5 Flash模型&#xff0c;該模型旨在提高速度和效率&#xff0c;以及Project Astra&#xff0c;這是對未來AI助手愿景的展示。1.5 Flash是專為大規模高頻任務優化的輕量級模型&#xff0c;具有突破性的長上下文窗口。同時…

Diffusers代碼學習: IP-Adapter Inpainting

IP-Adapter還可以通過Inpainting自動管道和蒙圖方式生成目標圖片。 # 以下代碼為程序運行進行設置&#xff0c;使用Inpainting 的自動管道&#xff0c; import os os.environ["HF_ENDPOINT"] "https://hf-mirror.com"from diffusers import AutoPipelin…

【java】速度搭建一個springboot項目

使用軟件&#xff1a;IDEA&#xff0c;mysql 使用框架&#xff1a;springboot mybatis-plus druid 坑點 使用IDEA搭建一個springboot項目的時候&#xff0c;需要考慮一下IDEA版本支持的JDK版本以及maven版本。否則再構建項目&#xff0c;引入pom的時候就會報錯。 需要檢查…

04 uboot 編譯與調試

新手不需要詳細掌握 uboot,只需要知道它是一個什么東西即可,工作中也只是改一些參數而已。 1、uboot 是什么 Linux 系統要啟動就必須需要一個 bootloader 程序,也就說芯片上電以后先運行一段 bootloader 程序。這段 bootloader 程序會先初始化 DDR 等外設,然后將 Linux 內…

利用PowerQuery控制數據行數

PowerBI報表在開發的過程中&#xff0c;經常會遇到數據量非常龐大的情況&#xff0c;在這種情況下&#xff0c;本機連接數據源如果不進行特殊處理的話&#xff0c;那么刷新數據的時候可能會發生數據刷新時間過長、數據加載內存錯誤、開發過程中構建DAX卡頓等情況。 那么在實際開…

不確定性+電動汽車!含高比例新能源和多類型電動汽車的配電網能量管理程序代碼!

前言 能源供應的可持續性和清潔性是當今世界共同關注的議題&#xff0c;配電網與可再生能源發電相結合&#xff0c;通過多能互補和梯級利用&#xff0c;在不同時空取長補短&#xff0c;提高能源利用率&#xff0c;減少溫室氣體排放&#xff0c;是解決能源短缺和環境問題的有效…

遞歸及其使用

遞歸及其使用 1. 什么是遞歸&#xff1f;2. 遞歸解決什么問題&#xff1f;3. 遞歸的步驟4. 使用遞歸的注意事項5. 示例 1. 什么是遞歸&#xff1f; 遞歸是指在函數的定義中使用函數自身的過程。簡單來說&#xff0c;遞歸是通過將大問題分解為更小的子問題來解決問題的一種方法…

[職場] 關于薪酬需要知道的兩個知識點 #知識分享#知識分享

關于薪酬需要知道的兩個知識點 薪酬問題是面試過程中比較核心的問題&#xff0c;也是每次面試必問的。如果你進入到面試的后一階段&#xff0c;這類問題可以讓面試官或企業判斷求職者的要求是否符合企業的薪酬標準&#xff0c;并進一步判斷求職者對自身價值的認可程度。關于薪…

數據結構之快速排序算法(快排)【圖文詳解】

P. S.&#xff1a;以下代碼均在VS2019環境下測試&#xff0c;不代表所有編譯器均可通過。 P. S.&#xff1a;測試代碼均未展示頭文件stdio.h的聲明&#xff0c;使用時請自行添加。 博主主頁&#xff1a;LiUEEEEE ??????????????????? ?? …