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
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...