Spring IoC如何存取Bean對象

小王學習錄

  • IoC(Inversion of Control)
    • 1. 什么是IoC
    • 2. 什么是Spring IoC
    • 3. 什么是DI
    • 4. Spring IoC的作用
  • 存儲Bean對象
    • 1. 創建Bean
    • 2. 將Bean注冊到Spring中.
  • 取Bean對象.
    • 1. 獲取Spring上下文信息
      • 使用ApplicationContext和BeanFactory的區別
    • 2. 獲取指定Bean對象

IoC(Inversion of Control)

1. 什么是IoC

Inversion of Control, 控制反轉. 所謂控制, 就是控制對象的生命周期. 對象的生命周期由創建這個對象的類控制. 有時對控制權進行反轉, 可以起到很好的編程效果, 從而完成特定的功能.

例如: 創建了一個對象, 稱為對象1, 對象1要依賴于對象2, 對象2要依賴于對象3.

  1. 如果在對象1中創建對象2, 在對象2中創建對象3. (也就是對象3的控制權在類2中, 對象2的控制權在類1中)

  2. 當改變一個類的構造方法時, 如在構造方法中增加參數, 同時也需要對依賴這個類的類中的代碼進行修改.

  3. 也就是如果此時要對類3的構造函數進行修改, 同時類2和類1中的構造函數也要進行修改. 這就造成了高耦合.

  4. 如果將創建對象的操作都在類1中進行, 也就是將控制權反轉給類1, 那么此時如果要對類3的構造函數進行修改, 只需要對類1和類3的構造函數進行修改即可了.

2. 什么是Spring IoC

上面已經介紹了IoC控制反轉, 所謂Spring IoC就是將控制權交給Spring, 即將對象的創建以及后續的管理(對象的生命周期交給Spring). 實際上IoC是Spring框架中的一個核心理念, 因此, Spring也可以看作是實現了IoC功能的容器(框架), 是一個包含了眾多工具和方法的IoC容器.

Spring容器中用于存儲JavaBean對象, 既然是容器, 就又有了兩大核心功能, 即對象(Bean)的存和取.

3. 什么是DI

Dependency Injection, 依賴注入. 是將依賴的某個對象注入到當前類的行為.

DI依賴注入是一種技術, 而IoC是一種思想. Spring為IoC提供了容器. 而依賴注入是用于解決容器中取Bean的技術之一. 因此可以說DI是IoC的一種實現.

IoC(Inversion of Control)和DI(Dependency Injection)通常被認為是同一件事的不同表述,因為它們都涉及到將控制權從應用程序本身轉移到外部容器,并通過容器來管理對象的創建、裝配和生命周期。

在通過將對象之間的關系交給外部容器來實現解耦、可維護和可測試這件事中. IoC強調的是控制的反轉,即應用程序不再控制對象的創建和生命周期,而是將這些任務交給外部容器。而DI強調的是依賴的注入,即對象不再負責自己依賴關系的創建,而是通過外部注入的方式獲取依賴。

4. Spring IoC的作用

  1. Spring IoC通過控制反轉的思想, 將對象的創建和管理交給了Spring, 實現了解耦
  2. 使用對象時更加方便. 程序員不必關注對象的創建以及這個對象背后的依賴關系, 而是直接向Spring容器中通過DI取對象, 當不需要再利用此對象時, 再交給Spring繼續對對象進行管理即可.
  3. 創建對象更加高效. 對于一個類的實例來說, 不必再進行重復的創建操作, 而是由Spring創建(默認是單例的), 每當有程序要用到實例時, 直接從Spring中取即可.

存儲Bean對象

spring作為一個容器, 要完成的兩大核心功能是存儲Bean對象和取出Bean對象.

存儲Bean對象需要先創建Bean, 然后將Bean注冊到Spring容器中.

1. 創建Bean

所謂Bean對象就是java中的普通對象. 在Spring中, 將被多次使用(取)的對象稱為Bean對象. 創建Bean很簡單, 和之前創建一個類的寫法無異. 以下是創建一個簡單的Bean

public class UseController {public void print(){System.out.println("do_useController");}
}

2. 將Bean注冊到Spring中.

  1. 首先要在resources目錄下創建一個spring配置文件(spring-config.xml).在配置文件中加入如下代碼.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
  1. 將bean注冊到spring中, 這一步也很簡單. 在配置文件中加入如下代碼
  <bean id="useController" class="com.annotation.UseController"></bean>

id是對象名, class是類的路徑. 以上步驟就將useControoller這個Bean對象存儲到Spring中了, 接下來我們看如何從Spring中吧Bean取出來.

取Bean對象.

取Bean對象分為以下兩步:

  1. 獲取Spring上下文信息. Bean對象交由Spring進行管理, 因此要想獲取到Bean對象, 就需要先獲取Spring上下文信息.
  2. 使用getBean方法獲取Bean對象.

1. 獲取Spring上下文信息

在獲取Spring上下文信息時, 需要獲取Spring的配置信息. 即xml文件.

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring-config.xml");

獲取Spring上下文信息除了使用ApplicationContext外, 還可以使用BeanFactory, 如下代碼

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("Spring-config.xml"));

使用ApplicationContext和BeanFactory的區別

繼承關系和功能??來說:Spring 容器有兩個接?:BeanFactory 和
ApplicationContext。其中 BeanFactory 提供了基礎的訪問容器的能?,? ApplicationContext屬于 BeanFactory 的?類,它除了繼承了 BeanFactory 的所有功能之外,它還擁有獨特的特性,還添加了對國際化?持、資源訪問?持、以及事件傳播等??的?持。
從性能??來說:ApplicationContext 是在Spring框架使用時?次性加載并初始化所有的 Bean對象, BeanFactory 是需要哪個才去加載哪個,因此更加輕量。

2. 獲取指定Bean對象

獲取指定Bean對象有以下三種寫法:

UseController useController =(UseController) applicationContext.getBean("useController");
//這種方法不適于同一類有多個Bean對象的情況. 
//因為當同一類有多個Bean對象時, 不知道具體要獲取UseController的哪個對象
UseController useController =applicationContext.getBean(UseController.class);
UseController useController =applicationContext.getBean("useController", UseController.class);



本篇文章到此結束, 下篇文章將具體介紹如何通過更簡單的方式(基于注解)來存取Bean對象.

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

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

相關文章

使用JLink仿真器實現調試打印的N種方法

方法一&#xff1a;使用MCU的串口 這是最古老也是最簡單的方法。 電腦上面插一個USB轉TTL&#xff0c;然后與MCU的UART_RX/UART_TX/GND連接起來。PC端再打開一個串口調試助手。兩邊的波特率一致&#xff0c;就可以收到MCU發過來的打印信息了。 方法二&#xff1a;使用JLink仿…

【EMNLP 2023】面向Stable Diffusion的自動Prompt工程算法

近日&#xff0c;阿里云人工智能平臺PAI與華南理工大學朱金輝教授團隊合作在自然語言處理頂級會議EMNLP2023上發表了BeautifulPrompt的深度生成模型&#xff0c;可以從簡單的圖片描述中生成高質量的提示詞&#xff0c;從而使文生圖模型能夠生成更美觀的圖像。BeautifulPrompt通…

Android--Jetpack--Databinding源碼解析

慢品人間煙火色&#xff0c;閑觀萬事歲月長 一&#xff0c;基本使用 關于databinding的基本使用請看之前的文章 Android--Jetpack--Databinding詳解-CSDN博客 二&#xff0c;xml布局解析 分析源碼呢&#xff0c;主要就是從兩方面入手&#xff0c;一個是使用&#xff0c;一個…

STM32F407-14.1.0-01高級定時器簡介

TIM1 和 TIM8 簡介 高級控制定時器&#xff08;TIM1 和 TIM8&#xff09;包含一個 16 位自動重載計數器&#xff0c;該計數器由可編程預分頻器驅動。 此類定時器可用于各種用途&#xff0c;包括測量輸入信號的脈沖寬度&#xff08;輸入捕獲&#xff09;&#xff0c;或者生成輸出…

微軟NativeApi-NtQuerySystemInformation

微軟有一個比較實用的Native接口&#xff1a;NtQuerySystemInformation&#xff0c;具體可以參考微軟msdn官方文檔&#xff1a;NtQuerySystemInformation&#xff0c; 是一個系統函數&#xff0c;用于收集特定于所提供的指定種類的系統信息。ProcessHacker等工具使用NtQuerySys…

Javascript 數組array賦值與取值

Javascript 數組array賦值與取值 目錄 Javascript 數組array賦值與取值 一、數組元素的賦值 1、在創建Array對象時直接賦值 2、利用Array對象的元素下標對數組進行賦值 二、數組元素的獲取 一、數組元素的賦值 對數組元素賦值共有2種方法&#xff1a; &#xff08;1&am…

每日一題,頭歌平臺c語言題目

任務描述 題目描述:輸入一個字符串&#xff0c;輸出反序后的字符串。 相關知識&#xff08;略&#xff09; 編程要求 請仔細閱讀右側代碼&#xff0c;結合相關知識&#xff0c;在Begin-End區域內進行代碼補充。 輸入 一行字符 輸出 逆序后的字符串 測試說明 樣例輸入&…

項目實戰第四十七講:易寶支付對接詳解(保姆級教程)

易寶支付對接(保姆級教程) 為了實現項目的支付需求,公司選擇了易寶支付進行對接,本文是項目實戰第四十七講,詳解易寶支付對接。 文章目錄 易寶支付對接(保姆級教程)1、需求背景2、流程圖3、技術方案4、相關接口4.1、入駐相關(商戶入網)4.2、賬戶相關接口(充值、提現、…

【LVGL】STM32F429IGT6(在野火官網的LCD例程上)移植LVGL官方的例程(還沒寫完,有問題 排查中)

這里寫目錄標題 前言一、本次實驗準備1、硬件2、軟件 二、移植LVGL代碼1、獲取LVGL官方源碼2、整理一下&#xff0c;下載后的源碼文件3、開始移植 三、移植顯示驅動1、enable LVGL2、修改報錯部分3、修改lv_config4、修改lv_port_disp.c文件到此步遇到的問題 Undefined symbol …

Vue路由守衛筆記

路由守衛 當路由切換時&#xff0c;判斷權限 路由守衛類型 1.全局守衛 2.獨享守衛 3.組件內守衛 1.全局守衛 1.前置路由守衛 全局前置路由守衛————初始化的時候被調用、每次路由切換之前被調用 在需要加上路由守衛的路由配置中加上 meta&#xff1a;{isAuth&#xff1…

x的平方根算法(leetcode第69題)

題目描述&#xff1a; 給你一個非負整數 x &#xff0c;計算并返回 x 的 算術平方根 。由于返回類型是整數&#xff0c;結果只保留 整數部分 &#xff0c;小數部分將被 舍去 。注意&#xff1a;不允許使用任何內置指數函數和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。…

react中img引入本地圖片的方式

在html文件中,可以直接<img src=./roadBook.png /> 但是在jsx文件中,不支持這種寫法 必須這樣寫 在css樣式中 App.css .img{background: url(./img/roadBook.png) }App.js import ./App.css;<div className=img></div> 1.基于es6Module //導入 import…

【PTA-C語言】實驗五-一維數組

如果代碼存在問題&#xff0c;麻煩大家指正 ~ ~有幫助麻煩點個贊 ~ ~ 實驗五-一維數組 7-1 查找整數&#xff08;分數 15&#xff09;7-2 交換最小值和最大值&#xff08;分數 15&#xff09;7-3 簡化的插入排序&#xff08;分數 15&#xff09;7-4 刪除指定數據&#xff08;分…

node14升級node16之后,webpack3項目無法啟動處理

node從14升級到16之后&#xff0c;項目就無法啟動了&#xff0c;研究了webpack3升級5&#xff0c;研究好幾個小時都無法啟動&#xff0c;最后發現&#xff0c;微微升級幾個版本就可以了。webpack還是3 版本改了好多個的&#xff0c;但是不確定具體是哪幾個起作用的&#xff0c;…

var、let、const 的區別?

var 1、var 聲明的變量在全局內有效 2、可以重復聲明 3、var 聲明的變量存在變量提升 let 1、遇到{}可開啟塊級作用域 2、不能重復聲明--- 可以防止變量重復定義產生的沖突&#xff0c;會直接報錯 3、let 聲明的變量不存在變量提升 const 1、const 聲明…

解讀unity內置的軟陰影處理方式

解讀unity內置的軟陰影處理方式&#xff1a; 參考網址&#xff1a; https://blog.csdn.net/cgy56191948/article/details/105726682 https://blog.csdn.net/weixin_45776473/article/details/119582218 https://tajourney.games/5482/ 上面的博客已經論述了&#xff0c;為何出現…

個人博客搭建保姆級教程-Nginx篇

官方文檔 nginx documentation 說明 nginx是我們本次教程使用的http服務器。它能承受很高的并發&#xff0c;并且安裝簡單&#xff0c;占用內存少。 在服務器篇我們提到了nginx的安裝&#xff0c;在發布篇我們簡述了該怎么放置我們創建的博客html文檔。 在本篇&#xff0c…

css的復合選擇器(有案例)

目錄 復合選擇器的描述 后代選擇器&#xff08;常用重點&#xff09; 子選擇器 并集選擇器&#xff08;重點常用&#xff09; 偽類選擇器 鏈接偽類選擇器 focus 偽類選擇器 知識總結&#xff1a; 案例實現&#xff1a; 復合選擇器的描述 在 CSS 中&#xff0c;可以根…

日志門面slf4j和各日志框架

簡介 簡單日志門面(Simple Logging Facade For Java) SLF4J主要是為了給Java日志訪問提供一套標準、規范的API框架&#xff0c; 其主要意義在于提供接口&#xff0c;具體的實現可以交由其他日志框架&#xff0c;如log4j、logback、log4j2。 對于一般的Java項目而言&#xff…

一個用于處理嵌入式系統中的 NAND Flash 存儲器的工具 `kobs-ng`

一個用于處理嵌入式系統中的 NAND Flash 存儲器的工具 kobs-ng kobs-ng 是一個用于處理嵌入式系統中的 NAND Flash 存儲器的工具。它是 U-Boot&#xff08;開源引導加載程序&#xff09;中的一個子項目&#xff0c;用于擦除、寫入和讀取 NAND Flash 設備上的數據。 以下是 kob…