Spring BeanDefinition

BeanDefinition,顧名思義,是一個對象(Bean)在Spring中描述,其核心類圖:
在這里插入圖片描述
在這里插入圖片描述
從類圖我們詳細了解BeanDefinition。
BeanDefinition接口繼承自BeanMetadataElement和AttributeAccessor兩個接口。
BeanMetadataElement:bean元數據,返回該bean的來源。
AttributeAccessor:Spring定義的屬性訪問器,對Bean的屬性進行操作的API,例如設置屬性、獲取屬性、判斷是否存在該屬性,返回bean所有的屬性名稱等。
下面重點分析一下BeanDefinition接口。
屬性列表:
1)String SCOPE_SINGLETON,bean的作用范圍,單例模式
2)String SCOPE_PROTOTYPE,bean的作用范圍為prototype,在Spring生命周期中,會存在多個,由垃圾回收期管理其生命周期。
3)int ROLE_APPLICATION:bean的角色定義,默認,為應用程序定義。
4)int ROLE_SUPPORT:bean的角色定義,為應用程序定義的比較大的對象。
5)int ROLE_INFRASTRUCTURE:Spring內部定義的Bean對象。
核心方法詳解:
1)void setBeanClassName(String beanClassName) :該Bean的class name。
2)void setScope(String scope):bean的生命周期,單例還是prototype。
3)void setLazyInit(boolean lazyInit):lazyInit,是否延遲加載,如果設置為true,在需要用到時再初始化。
4)void setDependsOn(String… dependsOn):dependsOn一般用于兩個bean之間沒有顯示依賴,但后一個Bean需要用到前一個Bean執行初始方法后的結果。例如在< bean id=”a” dependsOn=”b”/> 時,在初始化a時首先先初始化b,在銷毀b之前會先銷毀a。
5)void setAutowireCandidate(boolean autowireCandidate)設置該對象是否可以被其他對象自動裝配。
spring通過配置bean的autowire屬性設置自動裝配方式:
no:不使用自動裝配,必須通過ref元素指定依賴,為autowire默認值。
byName:使用屬性名自動裝配,如果存在一個與指定屬性名相同類型的bean則自動裝配,如果有多個,則拋
出異常。
byType:根據類型自動狀態,如果存在與指定屬性類型相同的bean,則自動裝配,如果有多個,則拋出異常。
constructor:與byType類似,不同之處在于它使用的是構造器的參數類型。
autodetect:通過bean的自省機制來決定是使用constructor還是byType來進行自動裝配。如果有默認構造
器,則使用byType,否則使用constructor。
6)void setPrimary(boolean primary),如果其他對象按照類型自動裝配時發現有多個符合類型的多個實現bean,如果bean的primary屬性為true,則以primary為true的優先,當然如果有多個primary為true,則拋出異常。
7)void setFactoryBeanName(String factoryBeanName):設置bean的factoryBeanName。
8)void setFactoryMethodName(String factoryMethodName):設置bean工廠的方法名,Spring在實例化Bean對象時支持工廠方法設計模式,在初始化bean時不是通過bean的class發射創建 bean實例,而是根據factoryBeanName反射出工廠的實例,然后調用它的實例方法factoryMethodName來創建bean實例。
9)ConstructorArgumentValues getConstructorArgumentValues():獲取bean的構造方法參數。
10)MutablePropertyValues getPropertyValues():獲取實例bean的所有屬性。
11)boolean isSingleton():是否是單例。
12)boolean isPrototype():是否是非單例。
13)boolean isAbstract():是否是抽象的。

本文主要是根據BeanDefinition接口了解bean的一些特性,值得引起注意的是:lazy-init、depends-on、autowire-candidate、autowire、primary、factory-bean、factory-method。
注:本文并沒有嘗試去羅列spring bean標簽的全部屬性。

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

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

相關文章

樂尚網絡:小程序商城零售行業10大新賦能

微信小程序上線以來&#xff0c;各行各業積極入場小程序&#xff0c;著手打造屬于自己的小程序生態。小程序形態多樣&#xff0c;適合你的小程序才是最好的&#xff1b;在眾多形態中&#xff0c;小程序商城可以說是零售行業的主體形態了&#xff0c;因為通過平臺直接實現交易是…

深度學習中的正則化

正則化方法有如下幾種&#xff1a; 一、參數范數懲罰 其中L2、L1參數正則化介紹與關系如下 1、L2 參數正則化 直觀解釋如下&#xff1a; 2、L1 參數正則化 二、獲取更多數據&#xff08;擴樣本&#xff09; 避免過擬合的基本方法之一是從數據源獲得更多數據&#xff0c;當訓練數…

spring uml

spring執行流程&#xff1a; 1&#xff1a; 加載spring.xml文件 2&#xff1a; 創建xml文件解析器 3&#xff1a; 獲取命名空間&#xff0c;即在spring.xml文件中的 http://www.springframework.org/schema/context 4&#xff1a; 根據命名空間找到命名空間處理器&#xff0c;在…

「造個輪子」——cicada(輕量級 WEB 框架)

前言 俗話說 「不要重復造輪子」&#xff0c;關于是否有必要不再本次討論范圍。 創建這個項目的主要目的還是提升自己&#xff0c;看看和知名類開源項目的差距以及學習優秀的開源方式。 好了&#xff0c;現在著重來談談 cicada 這個項目的核心功能。 我把他定義為一個快速、輕量…

基于owncloud構建私有云儲存網盤

注意事項&#xff1a;需要ping通外網 需要LAMP架構yum -y install httpd php php-mysql mariadb-server mariadb sqlite php-dom php-mbstring php-gd php-pdo 開啟服務[rootowncloud ~]# setenforce 0setenforce: SELinux is disabled[rootowncloud ~]# systemctl stop firewa…

Spring 源碼分析之AbstractApplicationContext源碼分析

首先我覺得分析ApplicationContext必須從它的實現類開始進行分析&#xff0c;AbstractApplicationContext我覺得是一個不錯的選擇&#xff0c;那我們就從這里開始逐一分析吧&#xff0c;首先我自己手畫了一張圖&#xff0c;作為索引吧&#xff0c;其中藍色的為類&#xff0c;紫…

[USACO15FEB]Superbull (最小生成樹)

題目鏈接 Solution 基本上就是個板子. 因為 \(n\) 很小,只有 \(2000\),所以直接暴力建圖,然后跑最小生成樹就好了. Code #include<bits/stdc.h> #define ll long long using namespace std; const int maxn2008; struct sj{int to,fr; ll w; }a[maxn*maxn]; int fa[maxn]…

Java中九大內置對象

1、Request對象 該對象封裝了用戶提交的信息&#xff0c;通過調用該對象相應的方法可以獲取封裝的信息&#xff0c;即使用該對象可以獲取用戶提交的信息。 當Request對象獲取客戶提交的漢字字符時&#xff0c;會出現亂碼問題&#xff0c;必須進行特殊處理。首先&#xff0c;…

ORACLE導出導入意外終止導致 ORACLE initialization or shutdown in progress 問題解決

由于意外情況導致 ORACLE initialization or shutdown in progress 個人理解為主要是歸檔日志出現問題&#xff0c; 首先cmd 1.sqlplus /nolog 進入sqlplus 2.connect /as sysdba 連接dba 3.shutdown normal 卸載數據庫 4.startup mount;重啟例程 5.alter database open;開…

Spring中資源的加載ResourceLoader

Spring中資源的加載是定義在ResourceLoader接口中的&#xff0c;它跟前面提到的抽象資源的關系如下&#xff1a; ResourceLoader的源碼 public interface ResourceLoader { /** Pseudo URL prefix for loading from the class path: "classpath:" */ String CLAS…

Codeforces Round #540 (Div. 3)(部分題解)

鏈接:http://codeforces.com/contest/1118 來源:Codeforces 文章目錄A. Water BuyingB. Tanya and Candies(前綴和)D1. Coffee and Coursework (Easy version)(貪心)D2. Coffee and Coursework (Hard Version)(二分)A. Water Buying 題意:用最小的花費買到剛好合適的東西.我們可…

集合一些方法陷阱

一&#xff1a;asList 數組轉ArrayList陷阱&#xff1a; asList() 源碼&#xff1a;public static <T> List<T> asList(T... a) { return new ArrayList<T>(a); } private final E[] a; ArrayList(E[] array) { if (arraynull) throw new NullPointerExcept…

java項目中的classpath

在java項目中&#xff0c;你一定碰到過classpath&#xff0c;通常情況下&#xff0c;我們是用它來指定配置/資源文件的路徑。在剛開始學習的時候&#xff0c;自己也糊里糊涂&#xff0c;但是現在&#xff0c;是時候弄清楚它到底是指什么了。 顧名思義&#xff0c;classpath就是…

C++命名空間(namespace)

在c中&#xff0c;名稱&#xff08;name&#xff09;可以是符號常量、變量、函數、結構、枚舉、類和對象等等。工程越大&#xff0c;名稱互相沖突性的可能性越大。另外使用多個廠商的類庫時&#xff0c;也可能導致名稱沖突。為了避免&#xff0c;在大規模程序的設計中&#xff…

P1556 幸福的路

題意&#xff1a;平面內有N頭牛$N\le 10$john從&#xff08;0,0&#xff09;出發&#xff0c;最后回到(0,0) 只有走到牛那里john才可以改變方向&#xff0c;否則沿著直線走 問john經過每一頭牛并且在每一頭牛出恰好改變方向一次的方案&#xff08;牛可以經過多次&#xff0c;但…

Class.getResource和ClassLoader.getResource

一案例驅動 二源碼分析 三類加載器ClassLoader 四總結 五參考 一案例驅動 最近加載文件的時候遇到了一個問題&#xff0c;很有意思&#xff01; 具體看下面案例代碼 public class TestClassLoader {public static void main(String[] args) {System.out.println(TestClassLoad…

spring-6、動態代理(cglib 與 JDK)

JDK動態代理與Cglib動態代理 JDK動態代理: 1.能夠繼承靜態代理的全部優點.并且能夠實現代碼的復用.2.動態代理可以處理一類業務.只要滿足條件 都可以通過代理對象進行處理.3.動態代理的靈活性不強.4.JDK 的動態代理要求代理者必須實現接口, , 否則不能生成代理對象. . 1 packag…

JDK安裝與配置(Windows 7系統)

1.前言 安裝之前需弄清JDK、JRE、JVM這幾個概念&#xff0c;不然稀里糊涂不知道自己在裝什么。 &#xff08;1&#xff09;什么是java環境&#xff1a;我們知道&#xff0c;想聽音樂就要安裝音樂播放器&#xff0c;想看圖片需要安裝圖片瀏覽器&#xff0c;同樣道理&#xff0c;…

UVA839

這道題又是一道遞歸的題目 先貼上代碼 //這種沒有明確說個數的動態分配還是得用new #include<cstdio> #include<iostream> using namespace std; struct mobile {int WL,DL,WR,DR;mobile *left,*right;mobile(mobile *aNULL,mobile*bNULL):left(a),right(b){} }; m…

Thread.getContextClassLoader與Thread.getClassLoader()區別

在閱讀spring boot啟動時候的源碼中&#xff0c;發現獲取classLoader使用的是getContextClassLoader于是乎產生了疑問&#xff0c;這種獲取ClassLoader的方式與我們最常見的通過Class.getClassLoader二者有什么區別&#xff1f;都是在什么場景下使用呢&#xff1f; 首先來看看…