Spring源碼之BeanDefinition類別的詳細介紹
這篇文章帶給大家的內容是關於Spring源碼之BeanDefinition類的詳細介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
Spring版本為5.1.5
用過spring的人都知道,我們將物件注入到spring容器中,交給spring來幫我們管理。這種對像我們稱為bean對象。但是這些bean物件在spring容器中,到底是以什麼形式存在,具有哪些屬性、行為呢?今天我們進入到spring源碼來一探究竟。
bean的創建工廠BeanFactory有個預設實作類別DefaultListableBeanFactory,內部有個存放所有註入bean物件資訊的Map
/** Map of bean definition objects, keyed by bean name. */ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
Map的value物件BeanDefinition就是spring中對bean的定義與描述,具體概述如下:
| 屬性 | 行為 | 解釋 |
|---|---|---|
| parentName | String getParentName(); void setParentName(@Nullable String parentName); |
bean定義物件的父類別定義物件名稱 |
| #beanClassName | String getBeanClassName(); void setBeanClassName(@Nullable String beanClassName); |
bean物件的實際類別類別 |
| scope | String getScope(); void setScope(@Nullable String scope); |
bean物件是否為單例 |
| lazyInit | boolean isLazyInit(); void setLazyInit(boolean lazyInit); |
是否懶載入 |
| dependsOn | String[] getDependsOn(); void setDependsOn(@Nullable String... dependsOn); |
設定依賴的bean對象,被依賴的bean物件總是會比目前bean物件先建立 |
| autowireCandidate | boolean isAutowireCandidate(); void setAutowireCandidate(boolean autowireCandidate); |
設定是否可以自動注入。只對@Autowired註解有效,設定檔中可以透過property顯示注入 |
| #primary | boolean isPrimary(); void setPrimary(boolean primary); |
配置bean為主要候選bean。當同一個介面的多個實作類別或一個類別多次注入spring容器時,透過該屬性來配置某個bean為主候選bean,透過型別來注入時,預設為使用主候選bean注入 |
| factoryBeanName | String getFactoryBeanName(); void setFactoryBeanName(@Nullable String factoryBeanName); |
設定建立bean的工廠名稱 |
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
/**
* Override the target scope of this bean, specifying a new scope name.
* @see #SCOPE_SINGLETON
* @see #SCOPE_PROTOTYPE
*/
void setScope(@Nullable String scope);
/**
* Return the name of the current target scope for this bean,
* or {@code null} if not known yet.
*/
@Nullable
String getScope();
}###實際使用#######假設有以下兩個bean,Java程式碼如下######MyTestBean####package com.yuanweiquan.learn.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Description;
public class MyTestBean {
@Autowired
private AutowireCandidateBean autowireCandidateBean;
public void init() {
System.out.println("inti MyTestBean");
}
public AutowireCandidateBean getAutowireCandidateBean() {
return autowireCandidateBean;
}
public void setAutowireCandidateBean(AutowireCandidateBean bean) {
this.autowireCandidateBean = bean;
}
}### AutowireCandidateBean###package com.yuanweiquan.learn.bean;
public class AutowireCandidateBean {
public void initBean() {
System.out.println("init AutowireCandidateBean");
}
public void destroyBean() {
System.out.println("destroy AutowireCandidateBean");
}
}###下面看如何在設定檔applicationContext.xml來進行設定### <bean id="myTestBean" class="com.yuanweiquan.learn.bean.MyTestBean"
depends-on="autowireCandidateBean"
init-method="init"/>
<bean id="autowireCandidateBean"
class="com.yuanweiquan.learn.bean.AutowireCandidateBean"
init-method="initBean"
autowire-candidate="true"
destroy-method="destroyBean"
scope="singleton"
parent="myTestBean"
lazy-init="default"
primary="true">
<description>autowireCandidateBean description</description>
</bean>###接下來就是測試程式碼###FileSystemXmlApplicationContext factory =
new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
BeanDefinition myTestBeanDefinition =
factory.getBeanFactory().getBeanDefinition("autowireCandidateBean");
//输出
System.out.println("bean description:" + myTestBeanDefinition.getDescription());
System.out.println("bean class name:" + myTestBeanDefinition.getBeanClassName());
System.out.println("parent name:" + myTestBeanDefinition.getParentName());
System.out.println("scope:" + myTestBeanDefinition.getScope());
System.out.println("is lazyinit:" + myTestBeanDefinition.isLazyInit());
System.out.println("depends On:" + myTestBeanDefinition.getDependsOn());
System.out.println("is autowireCandidate:" + myTestBeanDefinition.isAutowireCandidate());
System.out.println("is primary:" + myTestBeanDefinition.isPrimary());
System.out.println("factory bean name:"+myTestBeanDefinition.getFactoryBeanName());
System.out.println("factory bean method name:" + myTestBeanDefinition.getFactoryMethodName());
System.out.println("init method name:" + myTestBeanDefinition.getInitMethodName());
System.out.println("destory method name:" + myTestBeanDefinition.getDestroyMethodName());
System.out.println("role:" + myTestBeanDefinition.getRole());
//关闭context,否则不会调用bean的销毁方法
factory.close();###控制台輸出如下###init AutowireCandidateBean inti MyTestBean bean description:autowireCandidateBean description bean class name:com.yuanweiquan.learn.bean.AutowireCandidateBean parent name:myTestBean scope:singleton is lazyinit:false depends On:null is autowireCandidate:true is primary:true factory bean name:null factory bean method name:null init method name:initBean destory method name:destroyBean role:0 destroy AutowireCandidateBean###到此為止,透過上面的信息,我們能清楚的看到各屬性對應的值。上述測試程式碼的目的是讓我們大家能看到bean在spring容器中,以什麼樣子的形式存在,具體有哪些屬性,屬性的值以及預設值是多少。也算初步的揭開了spring容器中bean的面紗,其實並沒有我們想像中的那麼神秘。 ##########
以上是Spring源碼之BeanDefinition類別的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!
熱AI工具
Undress AI Tool
免費脫衣圖片
Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片
AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。
Clothoff.io
AI脫衣器
Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!
熱門文章
熱工具
記事本++7.3.1
好用且免費的程式碼編輯器
SublimeText3漢化版
中文版,非常好用
禪工作室 13.0.1
強大的PHP整合開發環境
Dreamweaver CS6
視覺化網頁開發工具
SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
熱門話題
撰寫PHP評論的提示
Jul 18, 2025 am 04:51 AM
寫好PHP註釋的關鍵在於明確目的與規範,註釋應解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡單。 1.使用統一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強調邏輯背後的原因,如說明為何需手動輸出JS跳轉;3.在復雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標記待辦事項與問題,便於後續追踪與協作。好的註釋能降低溝通成本,提升代碼維護效率。
PHP開發環境設置
Jul 18, 2025 am 04:55 AM
第一步選擇集成環境包XAMPP或MAMP搭建本地服務器;第二步根據項目需求選擇合適的PHP版本並配置多版本切換;第三步選用VSCode或PhpStorm作為編輯器並搭配Xdebug進行調試;此外還需安裝Composer、PHP_CodeSniffer、PHPUnit等工具輔助開發。
PHP比較操作員
Jul 18, 2025 am 04:57 AM
PHP比較運算符需注意類型轉換問題。 1.使用==僅比較值,會進行類型轉換,如1=="1"為true;2.使用===需值與類型均相同,如1==="1"為false;3.大小比較可作用於數值和字符串,如"apple"
PHP評論語法
Jul 18, 2025 am 04:56 AM
PHP註釋有三種常用方式:單行註釋適合簡要說明代碼邏輯,如//或#用於當前行解釋;多行註釋/*...*/適合詳細描述函數或類的作用;文檔註釋DocBlock以/**開頭,為IDE提供提示信息。使用時應避免廢話、保持同步更新,並勿長期用註釋屏蔽代碼。
進行音頻/視頻處理
Jul 20, 2025 am 04:14 AM
音視頻處理的核心在於理解基本流程與優化方法。 1.其基本流程包括採集、編碼、傳輸、解碼和播放,每個環節均有技術難點;2.常見問題如音畫不同步、卡頓延遲、聲音噪音、畫面模糊等,可通過同步調整、編碼優化、降噪模塊、參數調節等方式解決;3.推薦使用FFmpeg、OpenCV、WebRTC、GStreamer等工具實現功能;4.性能管理方面應注重硬件加速、合理設置分辨率幀率、控制並發及內存洩漏問題。掌握這些關鍵點有助於提升開發效率和用戶體驗。
使用翻譯員立面在Laravel中進行定位。
Jul 21, 2025 am 01:06 AM
thetranslatorfacadeinlaravelisused forlocalization byfetchingTranslatingStringSandSwitchingLanguagesAtruntime.Touseit,storetranslationslationstringsinlanguagefilesunderthelangderthelangdirectory(例如,ES,ES,FR),thenretreiveTreivEthemvialang :: thenretRievEtheMvialang :: get()
用塊評論記錄PHP
Jul 18, 2025 am 04:53 AM
寫好PHP塊註釋能提升代碼可讀性和維護性,應包含@param、@return、@throws等信息,並說明“為什麼”和“怎麼用”,避免無意義重複,保持與代碼同步更新,IDE可自動識別提示。
PHP評論團隊
Jul 18, 2025 am 04:54 AM
寫好註釋對團隊協作至關重要,尤其在PHP項目中,關鍵在於如何寫出有用的註釋。 1.使用DocBlock明確函數用途,包括參數和返回值類型,提升IDE識別與開發效率;2.在復雜邏輯處添加行內註釋,解釋關鍵判斷條件或特殊處理;3.統一註釋風格,規範格式與內容要求,並藉助工具檢查,確保一致性。


