Spring IOC官方文檔學習筆記(二)之Bean概述

来源:https://www.cnblogs.com/shame11/archive/2022/12/19/16989365.html
-Advertisement-
Play Games

訓練模型過程中,經常需要追蹤一些性能指標的變化情況,以便瞭解模型的實時動態,例如:回歸任務中的MSE、分類任務中的Accuracy、生成對抗網路中的圖片、網路模型結構可視化…… 除了追蹤外,我們還希望能夠將這些指標以動態圖表的形式可視化顯示出來。 TensorFlow的附加工具Tensorboar... ...


1.Bean概述

(1) Spring IoC容器管理一個或多個bean,這些bean是根據我們所提供的配置元數據來創建的,在容器內部,BeanDefinition對象就代表了bean的配置元數據,它主要包含瞭如下幾個方面的內容:

屬性 說明
Class 全限定類名
Name bean的名稱
Scope bean的作用域
Constructor arguments 構造函數參數
Properties 成員變數屬性值
Autowiring Mode 自動裝配模式
Lazy initialization mode 懶載入模式
Initialization Method 初始化回調
Destruction Method 銷毀回調

(2) 一般情況下,Spring中的bean來自於Spring的自動掃描解析,除此之外,Spring還允許我們手動的向容器中註冊一些額外的對象,如下所示:
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("boke/definition.xml");
//1.獲取ApplicationContext中的BeanFactory
ConfigurableListableBeanFactory beanFactory = ctx.getBeanFactory();
Man man = new Man();
//2.通過beanFactory的registerSingleton方法向容器中註冊容器外的額外對象
beanFactory.registerSingleton("man", man);
//3.註冊之後,便可獲取使用該對象
Man existMan = beanFactory.getBean("man", Man.class);
existMan.doSomething();

總結一下,向Spring IOC容器中註冊額外對象,大致可分為兩步:
第一步:通過調用ApplicationContext實現類們的getBeanFactory()方法拿到DefaultListableBeanFactory
第二步:調用DefaultListableBeanFactory中的registerSingleton()方法或registerBeanDefinition()來向容器中註冊額外對象
註意:在實踐上由我們手動註冊的bean需要儘早向容器中註冊,如果註冊的太晚,就無法和Spring所提供的一些步驟結合,會導致一些依賴註入失敗

2.命名Bean

(1) Spring中的bean通常有一個唯一的id和多個別名,在基於xml的配置中,可通過bean標簽中的id屬性和name屬性來標識一個bean的id和別名,其中id屬性必須唯一,而name屬性可不唯一,多個別名之間用分號,逗號或空格分隔開,如下所示:

<!-- xml文件內容 -->
<beans ...>
    <!-- 定義了一個bean,它的id為man,別名為thisMan,yesMan -->
    <bean class="cn.example.spring.boke.Man" id="man" name="thisMan,yesMan"> </bean>
</beans>

//Java代碼:
ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/from.xml");
//列印下麵這三個Man對象的地址,發現它們的地址相同,為同一對象
Man man = (Man) ctx.getBean("man"), thisMan = (Man) ctx.getBean("thisMan"), yesMan = (Man) ctx.getBean("yesMan");

(2) 在基於Java code的配置中,如使用@Bean,@Component等註解時,id或name屬性不是必須提供的,如果都沒有,Spring容器會預設提供一個唯一的id(生成規則:通常情況下會按照駝峰命名法取類名並將其首字母小寫,但如果類名的第一,二個字元都是大寫時,會保留原始大小寫),如下所示

//例子一:定義一個bean,未聲明它的id或name,此時Spring會自動幫我們生成一個唯一的id,為exampleA
@Component
public class ExampleA {
    public void doSomething() {
        System.out.println("Hello This is ExampleA");
    }
}

//從Spring IOC中獲取上面這個bean
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("cn.example.spring");
//使用exampleA這個id來尋找容器中ExampleA對象
ExampleA exampleA = (ExampleA) ctx.getBean("exampleA");
exampleA.doSomething();

//例子二:定義了一個bean,未聲明它的id或name,且該類名的第一,二個字元都是大寫,此時Spring為其生成的id為IMyService,與類名相同
@Component
public class IMyService {
}
//驗證過程省略...

(3) 還可以使用alias標簽來定義一個bean的別名,如下

<beans ...>
    <bean class="cn.example.spring.boke.ExampleA" id="exampleA"> </bean>

    <!-- 此時,既可以用exampleA來獲取到這個bean,也可以用aliasA來獲取這個bean,它倆是等價的 -->
    <alias name="exampleA" alias="aliasA"></alias>
</beans>

3.實例化bean

(1) BeanDefinition在本質上就是bean的‘配方表’,容器會根據BeanDefinition中的配置信息來創建出所需要的對象供我們使用,在基於xml的配置中,通過bean標簽中的class屬性來指定要創建對象的類類型,這個bean標簽中的class屬性對應於BeanDefanition里的Class屬性

(2) 通過美元符號($)或點符號(.)來註冊靜態內部類,如下

public class Outer {
    //註意:這裡是‘靜態‘內部類
    public static class Inner {
        public void doSomething() {
            System.out.println("Here is inner");
        }
    }
}

<!-- xml文件配置 -->
<beans ...>
    <!-- 使用$調用靜態內部類 -->
    <bean class="cn.example.spring.boke.Outer$Inner" id="inner"></bean>

    <!-- 使用.調用靜態內部類,與上面的等價 -->
    <!-- <bean class="cn.example.spring.boke.Outer.Inner" id="inner"></bean> -->
</beans>

//使用
ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/from.xml");
//獲取已註冊到容器中的靜態內部類
Outer.Inner inner = (Outer.Inner) ctx.getBean("inner");
inner.doSomething();

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在七牛雲校園黑客馬拉松中,一款設計優秀、邏輯清晰的白板作品脫穎而出,獲得第二名的好成績,這就是來自鄭州大學Since團隊的White Rose白板,以下是他們的設計和架構分享。 一、前言 White Rose是參加七牛雲hackathon比賽的作品,賽題的主要內容是開發一個「多人協作白板」,旨在鼓勵 ...
  • 一、ES2015中有四種相等演算法1. 抽象(非嚴格)相等比較。(==)2. 嚴格相等比較。( )3. 同值。(Object.is())4. 同值零。二、JavaScript提供三種不同的值比較操作1. 嚴格相等比較,使用 比較符號。(在兩者進行比較時,不會執行類型轉換)2. 抽象相等比較,使用 == ...
  • 假設,我們有這樣一張 Gif 圖: 利用 CSS,我們嘗試來搞一些事情。 圖片的 Glitch Art 風 在這篇文章中 --CSS 故障藝術,我們介紹了利用混合模式製作一種暈眩感覺的視覺效果。有點類似於抖音的 LOGO。 像是這樣: 假設,我們有這樣一張圖: 只需要一個標簽即可 <div clas ...
  • 案例介紹 歡迎來到我的小院,我是霍大俠,恭喜你今天又要進步一點點了!我們來用JavaScript編程實戰案例,做一個表情評價程式。用戶打星進行評價,表情會根據具體星星數量發生變化。 案例演示 點擊星星可以進行滿意程度評價,星星數量變換表情也會隨之變換。 源碼學習 進入核心代碼學習,我們先來看HTML ...
  • 2015 年 HTTP/2 標準發表後,大多數主流瀏覽器也於當年年底支持該標準。此後,憑藉著多路復用、頭部壓縮、伺服器推送等優勢,HTTP/2 得到了越來越多開發者的青睞。不知不覺的 HTTP 已經發展到了第三代,鵝廠也緊跟技術潮流,很多項目也在逐漸使用 HTTP/3。本文基於興趣部落接入 HTTP... ...
  • 1)寫用例 TestCase 2)執行用例 1:TestSuite存儲用例,2:TestLoader找用例,存儲用例,存放指定的TestSuite 3)對比實際結果/期望結果,判定用例是否通過#斷言Assert 4)出局測試報告TextTestRunner 1.測試類 import requests ...
  • 1.get/post介紹 get和post是最常用的http/htttps請求方式,一定要掌握好二者各自特點以及區別。 2.get/post特點 get請求 請求參數在請求地址後面,提交的數據量較小,安全性較差,不建議用來提交敏感信息(地址欄中會顯示,並且有可能被保存請求地址)。 post請求 請求 ...
  • 家居網購項目實現04 以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git 10.功能09-後臺管理 刪除家居 10.1需求分析/圖解 需求如下: 管理員進入到家居管理頁面 點擊刪除家居連接,彈出確認視窗,確認刪除,取消放棄 10.2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...