【Spring進階系列丨第四篇】學習Spring中的Bean管理(基于xml配置)

前言

在之前的學習中我們知道,容器是一個空間的概念,一般理解為可盛放物體的地方。在Spring容器通常理解為BeanFactory或者ApplicationContext。我們知道spring的IOC容器能夠幫我們創建對象,對象交給spring管理之后我們就不用手動去new對象。

那么Spring是如何管理Bean的呢?

在這里插入圖片描述

文章目錄

  • 前言
  • 一、概念
  • 二、創建Bean對象的三種方式
    • 2.1、使用默認構造函數創建方式
      • 2.1.1、定義Bean
      • 2.1.2、主配置文件中配置bean
      • 2.1.3、測試Bean
      • 2.1.4、注意點
    • 2.2、使用工廠中的實例方法創建方式
      • 2.2.1、定義工廠
      • 2.2.2、定義Bean
      • 2.2.3、主配置文件中配置Bean
      • 2.2.4、測試
    • 2.3、使用工廠中的靜態方法創建方式
      • 2.3.1、定義工廠
      • 2.3.2、定義Bean
      • 2.3.3、主配置文件中配置Bean
      • 2.3.4、測試
  • 三、Bean對象的作用域
    • 3.1、說明
    • 3.2、作用域類型
    • 3.3、注意細節
    • 3.4、如何修改Bean的作用域
    • 3.5、測試
      • 3.5.1、測試singleton單例
      • 3.5.2、測試prototype多例
  • 四、Bean對象的生命周期
    • 4.1、單例對象
      • 4.1.1、說明
      • 4.1.2、測試
        • 4.1.2.1、定義Bean
        • 4.1.2.2、主配置文件中配置Bean
        • 4.1.2.3、測試
        • 4.1.2.4、測試結果
    • 4.2、多例對象
      • 4.2.1、說明
      • 4.2.2、測試
        • 4.2.2.1、定義Bean
        • 4.2.2.2、主配置文件中配置Bean
        • 4.2.2.3、測試1
        • 4.2.2.4、測試2
  • 五、總結

一、概念

簡而言之,Spring bean是Spring框架在運行時管理的對象。Spring bean是任何Spring應用程序的基本構建塊。你編寫的大多數應用程序邏輯代碼都將放在Spring bean中。

Spring bean的管理包括:

  • 創建一個對象
  • 提供依賴項(例如其他bean,配置屬性)
  • 攔截對象方法調用以提供額外的框架功能
  • 銷毀一個對象

Spring bean是框架的基本概念。作為Spring的用戶,你應該對這個核心抽象有深刻的理解。


二、創建Bean對象的三種方式

2.1、使用默認構造函數創建方式

2.1.1、定義Bean

public class UserServiceImpl {}

2.1.2、主配置文件中配置bean

<!-- 方式一:使用默認構造函數方式創建Bean   -->
<beans><bean id="userService" class="cn.bdqn.UserServiceImpl"></bean>
</beans>

2.1.3、測試Bean

@Test
public void testUserService() throws Exception{// 1、讀取主配置文件信息,獲取核心容器對象ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");// 2、從容器中根據id獲取對象(bean)UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");// 3、打印beanSystem.out.println(userService);
}

2.1.4、注意點

此種方式采用的就是通過默認構造函數的方式創建Bean,假設我們給UserServiceImpl添加了一個帶參的構造方法,則運行會報錯,原因在于當我們為某個類自定義構造方法的時候,Java編譯器便不會為該類提供默認的不帶參數的構造方法了。

2.2、使用工廠中的實例方法創建方式

2.2.1、定義工廠

// UserService的工廠,作用是創建UserServiceBean對象
public class UserServiceImplFactory {public UserServiceImpl createUserService(){return new UserServiceImpl();}
}

2.2.2、定義Bean

public class UserServiceImpl {}

2.2.3、主配置文件中配置Bean

<beans><!-- 方式二:使用工廠中提供的實例方法創建Bean   --><!-- 第一步:把該工廠定義出來   --><bean id="userServiceFactory" class="cn.bdqn.UserServiceImplFactory"/><!-- 第二步:定義Bean(通過userServiceFactory中提供的實例方法)--><bean id="userService" factory-bean="userServiceFactory" factory-method="createUserService"/>
</beans>

2.2.4、測試

@Test
public void testUserService() throws Exception{// 1、讀取主配置文件信息,獲取核心容器對象ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");// 2、從容器中根據id獲取對象(bean)UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");// 3、打印beanSystem.out.println(userService);
}

2.3、使用工廠中的靜態方法創建方式

2.3.1、定義工廠

// UserService的工廠,作用是創建UserServiceBean對象
public class UserServiceImplFactory {public static UserServiceImpl createUserService(){return new UserServiceImpl();}
}

2.3.2、定義Bean

public class UserServiceImpl {}

2.3.3、主配置文件中配置Bean

<beans><!-- 方式三:使用工廠中提供的靜態方法創建Bean   --><!-- 定義Bean(通過工廠類的靜態方法創建)   --><bean id="userService" class="cn.bdqn.UserServiceImplFactory" factory-method="createUserService"></bean>
</beans>

2.3.4、測試

@Test
public void testUserService() throws Exception{// 1、讀取主配置文件信息,獲取核心容器對象ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");// 2、從容器中根據id獲取對象(bean)UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");// 3、打印beanSystem.out.println(userService);
}

三、Bean對象的作用域

3.1、說明

? Spring對Bean的默認的作用域(作用范圍)是singleton【單例】

3.2、作用域類型

  • singleton:單例的(默認值),只會new一次。

  • prototype:多例的,用到一次就會new一次。

  • request:作用于web應用的請求范圍,Spring創建這個類之后,將這個類存到request范圍內。

  • session:應用于web項目的會話范圍,Spring創建這個類之后,將這個類存到session范圍內。

  • global-session:作用于集群環境的會話范圍(全局會話范圍),當不是集群環境時,它就是session。

3.3、注意細節

實際開發中用得最多的就是singletonprototype在整合struts2的時候使用prototype,在整合SpringMVC的時候使用singleton。

3.4、如何修改Bean的作用域

bean標簽的scope屬性,作用:指定bean的作用范圍。

3.5、測試

3.5.1、測試singleton單例

public class UserServiceImpl {}
<beans><bean id="userService" class="cn.bdqn.UserServiceImpl" />
</beans>
@Test
public void testUserService() throws Exception{// 1、讀取主配置文件信息,獲取核心容器對象ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");// 2、從容器中根據id獲取對象(bean)UserServiceImpl userService1 = (UserServiceImpl) ac.getBean("userService");UserServiceImpl userService2 = (UserServiceImpl) ac.getBean("userService");// 3、打印beanSystem.out.println(userService1 == userService2); // true
}

3.5.2、測試prototype多例

public class UserServiceImpl {}
<bean id="userService" class="cn.bdqn.UserServiceImpl" scope="prototype"/>
 @Test
public void testUserService() throws Exception{// 1、讀取主配置文件信息,獲取核心容器對象ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");// 2、從容器中根據id獲取對象(bean)UserServiceImpl userService1 = (UserServiceImpl) ac.getBean("userService");UserServiceImpl userService2 = (UserServiceImpl) ac.getBean("userService");// 3、打印beanSystem.out.println(userService1 == userService2); // false
}

四、Bean對象的生命周期

4.1、單例對象

4.1.1、說明

出生:當容器創建時對象出生
活著:只要容器還在,對象一直活著
死亡:容器銷毀,對象消亡

4.1.2、測試

4.1.2.1、定義Bean
public class UserServiceImpl {public UserServiceImpl(){System.out.println("對象的構造方法執行了");}public void init(){System.out.println("對象初始化了");}public void destroy(){System.out.println("對象銷毀了");        }
}
4.1.2.2、主配置文件中配置Bean
<beans><bean id="userService" class="cn.bdqn.UserServiceImpl"scope="singleton" init-method="init" destroy-method="destroy"/>
</beans>
4.1.2.3、測試
@Test
public void testUserService() throws Exception{// 1、讀取主配置文件信息,獲取核心容器對象ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");ac.close();
}
// 結果:對于單例對象來說,只要容器創建了,那么對象就創建了。類似于立即加載。
4.1.2.4、測試結果

對象的構造方法執行了
對象初始化了
對象銷毀了

總結:單例對象的生命周期和容器相同

4.2、多例對象

4.2.1、說明

出生:當我們使用對象時spring框架為我們創建
活著:對象只要是在使用過程中就一直活著。
死亡:當對象長時間不用,且沒有別的對象引用時,由Java的垃圾回收器回收

4.2.2、測試

4.2.2.1、定義Bean
public class UserServiceImpl {public UserServiceImpl(){System.out.println("對象的構造方法執行了");}public void init(){System.out.println("對象初始化了");}public void destroy(){System.out.println("對象銷毀了");        }
}
4.2.2.2、主配置文件中配置Bean
<beans><bean id="userService" class="cn.bdqn.UserServiceImpl"scope="prototype" init-method="init" destroy-method="destroy"/>
</beans>
4.2.2.3、測試1
@Test
public void testUserService() throws Exception{// 1、讀取主配置文件信息,獲取核心容器對象ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");ac.close();
}
// 結果:什么都不輸出,說明容器啟動的時候,對于多例對象來說并不會創建
4.2.2.4、測試2
@Test
public void testUserService() throws Exception{// 1、讀取主配置文件信息,獲取核心容器對象ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");System.out.println(userService);ac.close();
}
/**結果:對象的構造方法執行了對象初始化了說明:對于多例對象來說,只有等到真正使用到該對象的時候才會創建。類似于懶加載。
**/

? 對于多例的Bean,Spring框架是不負責管理的


五、總結

在這里插入圖片描述


以上就是本篇文章的全部內容了,如果對你有幫助的話,可以點個免費的關注,如果能在下方三連一下就更好啦,你的支持就是我更新的動力!

在這里插入圖片描述

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

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

相關文章

基于單片機的智能藍牙避障循跡小車

智能小車循跡與避障運動控制系統的設計 摘 要:本設計主要由STC89C52單片機來進行控制&#xff0c;通過輸入輸出兩個端口控制驅動模塊來調節電機的工作狀態。本設計預利用機器視覺&#xff0c;通過識別條帶狀路標實現自主導航且利用超聲波模塊實時檢測距離以實現避障功能&…

vue3 webSocket 封裝及使用

vue3 webSocket 封裝及使用 封裝 import { ref, onUnmounted } from vue; interface SocketOptions {heartbeatInterval?: number;reconnectInterval?: number;maxReconnectAttempts?: number; }class Socket {url: string;ws: WebSocket | null null;opts: SocketOption…

【Docker】從零開始:9.Docker命令:Push推送倉庫(Docker Hub,阿里云)

【Docker】從零開始&#xff1a;9.Docker命令:Push推送倉庫 知識點1.Docker Push有什么作用&#xff1f;2.Docker倉庫有哪幾種2.1 公有倉庫2.2 第三方倉庫2.3 私有倉庫2.4 搭建私有倉庫的方法有哪幾種 3.Docker公有倉庫與私有倉庫的優缺點對比 Docker Push 命令標準語法操作參數…

openEuler 22.03 LTS x86_64 cephadm 部署ceph18.2.0 未完成 筆記

環境 準備三臺虛擬機 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下載cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …

酷開系統 | 酷開科技聚焦價值人群 助力營銷增長

2023年&#xff0c;是消費復蘇回暖的一年&#xff0c;市場中充溢著大量品牌重啟增長的機遇與實例。品牌商期望能夠把握住市場趨勢&#xff0c;通過營銷獲得確定性的業績提升&#xff0c;并在未來收獲長期穩定的增長。作為數字媒介的代表之一&#xff0c;OTT大屏營銷的屬性和價值…

Vue學習之路------指令

Vue指令 vue會根據不同的指令&#xff0c;針對標簽實現不同的功能 指令:帶有v-前綴的特殊標簽屬性 1&#xff1a;v-html&#xff1a;指令 <div v-html"msg"></div> 2&#xff1a;v-show 作用&#xff1a;控制元素顯示隱藏 語法&#xff1a;v-show&quo…

【SpringMVC】 對請求的不同響應

前言 本文學習如何運用不同的注解來返回不同的響應. 1.返回靜態頁面Controller 返回index.html頁面 Controller 和 RestController的區別 controller 只有加上這個注解,Spring才會幫我們管理這個代碼.后續我們訪問時才能訪問到. RestController 等同于 Controller ResponseBo…

UML建模圖文詳解教程01——Enterprise Architect的安裝與使用

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Enterprise Architect概述 官方網站&#xff1a;https://www.sparxsystems.cn/products/ea/&#xff1b;圖示如下&#xff1a; Enterprise Architect是一個全功能的、基于…

B033-Servlet交互 JSP

目錄 ServletServlet的三大職責跳轉&#xff1a;請求轉發和重定向請求轉發重定向匯總請求轉發與重定向的區別用請求轉發和重定向完善登錄 JSP第一個JSP概述注釋設置創建JSP文件默認字符編碼集 JSP的java代碼書寫JSP的原理三大指令九大內置對象改造動態web工程進行示例內置對象名…

2.HTML入門

目錄 一.HTML介紹 二.HTML常用標簽 2.1 標題標簽 2.2 段落標簽 2.3 超鏈接標簽 2.4 圖片標簽 2.5 換行與空格 2.6 布局標簽 2.7 列表標簽 2.8 表單標簽 一.HTML介紹 定義&#xff1a;將內容顯示在網頁&#xff0c;用來描述網頁的一種語言&#xff0c;負責網頁的架構…

Adiponectin 脂聯素 ; T-cadherin +exosome

T-cadherin Adiponectin exosome T-cadherin Adiponectin exosome 代謝綜合征中 外泌體、脂肪組織 和 脂聯素 的器官間通訊-2019.pdf

【華為OD】C卷真題 100%通過:數組去重和排序 C/C++實現

華為OD 數組去重和排序 C源碼實現&#xff0c;100%通過 目錄 題目描述&#xff1a; 示例1 代碼實現&#xff1a; 題目描述&#xff1a; 給定一個亂序的數組&#xff0c;刪除所有的重復元素&#xff0c;使得每個元素只出現一次&#xff0c;并且按照出現的次數從高到低進行排…

C語言之字符串函數

C語言之字符串函數 文章目錄 C語言之字符串函數1. strlen的使用和模擬實現1.1 strlen的使用1.2 strlen的模擬實現 2. strcpy的使用和模擬實現2.1 strcpy的使用2.2 strncpy的使用2.3 strcpy的模擬實現 3. strcat的使用和模擬實現3.1 strcat的使用3.2 strncat3.3 strcat的模擬實現…

C語言--每日五道選擇題--Day23

第一題 1. 已知int i1, j2;&#xff0c;則表達式ij的值為&#xff08; &#xff09; A&#xff1a;1 B&#xff1a;2 C&#xff1a;3 D&#xff1a;4 答案及解析 C 本題考查的是前置和后置的優先級&#xff0c;后置的優先級是高于前置的&#xff0c;所以這個表達式就可以轉變為…

【Spark源碼分析】事件總線機制分析

Spark事件總線機制 采用Spark2.11源碼&#xff0c;以下類或方法被DeveloperApi注解額部分&#xff0c;可能出現不同版本不同實現的情況。 Spark中的事件總線用于接受事件并提交到對應的監聽器中。事件總線在Spark應用啟動時&#xff0c;會在SparkContext中激活spark運行的事件總…

什么是持續集成的自動化測試?

持續集成的自動化測試 如今互聯網軟件的開發、測試和發布&#xff0c;已經形成了一套非常標準的流程&#xff0c;最重要的組成部分就是持續集成&#xff08;Continuous integration&#xff0c;簡稱CI&#xff0c;目前主要的持續集成系統是Jenkins&#xff09;。 那么什么是持…

docker 安裝常用環境

一、 安裝linux&#xff08;完整&#xff09; 目前為止docker hub 還是被封著&#xff0c;用阿里云、騰訊云鏡像找一找版本直接查就行 默認使用latest最新版 #:latest 可以不寫 docker pull centos:latest # 拉取后查看 images docker images #給鏡像設置標簽 # docker tag […

FIB表與快速轉發表工作原理

在一張路由表中&#xff0c;當存在多個路由項可同時匹配目的IP地址時&#xff0c;路由查找進程會選擇掩碼最長的路由項用于轉發&#xff0c;即最長匹配原則。因為掩碼越長&#xff0c;所處的網段范圍就越小&#xff0c;網段的范圍越小&#xff0c;就越能快速的定位到PC機的具體…

【分布式】小白看Ring算法 - 03

相關系列 【分布式】NCCL部署與測試 - 01 【分布式】入門級NCCL多機并行實踐 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式訓練入門與實踐 - 04 概述 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;是由NVIDIA開發的一種用于多GPU間…

通過 python 腳本遷移 Redis 數據

背景 需求&#xff1a;需要將的 Redis 數據遷移由云廠商 A 遷移至云廠商 B問題&#xff1a;云版本的 Redis 版本不支持 SYNC、MIGRATE、BGSAVE 等命令&#xff0c;使得許多工具用不了&#xff08;如 redis-port&#xff09; 思路 &#xff08;1&#xff09;從 Redis A 獲取所…