spring-beans包源碼閱讀-3-BeanDefinition

歡迎光臨我的個人博客:https://www.jelliclecat.cn/

一. BeanDefinition介紹

第二個我們來說說BeanDefinition寿酌,這個接口也是spring的核心接口之一扮念,所有的Bean在實例化之前的各種各樣的信息都記錄在這個接口的實現(xiàn)類中凛驮。

Spring中Bean的配置來源可能很多,比如xml热监、@Service等注解標(biāo)注的類、以及硬編碼等,這時需要一個統(tǒng)一的類去封裝Bean的配置信息俩莽,這些信息會指導(dǎo)Bean的初始化行為和指明Bean具有的一些特性。這個封裝類就是BeanDefinition乔遮。

這個接口的位置在spring-beans模塊下的org.springframework.beans.factory.config扮超,可以看到這個接口首先在factory包下,然后在config包下蹋肮。這個位置也是非常合理的出刷,因為BeanDefinition就是在BeanFactory創(chuàng)建Bean實例的時候,記錄這個Bean的各種信息用的坯辩,比如說Bean的Class信息馁龟、是否是單例、是否懶加載漆魔、是否是抽象Bean坷檩、有哪些屬性却音、有哪些依賴的其他Bean、initMethod的名稱等等淌喻。這些信息都是用來初始化Bean的實例的時候使用到的僧家。顧名思義的理解就是對一個Bean的定義雀摘。

這個類可以說是BeanFactory的一個輔助類裸删,之后可以看到,BeanFactory的各種工作都是圍繞著BeanDefinition進(jìn)行的阵赠,也可以說這兩個接口是孿生接口涯塔,誰也離不開誰。BeanFactory無疑是spring最核心的接口清蚀,在我們正式分析BeanFactory之前匕荸,先好好看看與它關(guān)系密切的BeanDefinition接口。

二. BeanDefinition實現(xiàn)

image

GenericBeanDefinition是BeanDefinition的一個實現(xiàn)類枷邪,與GenericBeanDefinition平級的類還有RootBeanDefinition和ChildBeanDefinition榛搔。spring的Bean有一個特性就是可以繼承,一個bean可以指明另一個bean做自己的parent东揣,這里要注意践惑,這種方式指明的繼承關(guān)系在java虛擬機中并不存在,即嘶卧,如果使用instanceof等RTTI的方式去檢驗這兩個bean的繼承關(guān)系是失效的尔觉,他們只是邏輯上的繼承關(guān)系并具有一些繼承的特性,比如重寫和重寫父bean的方法和屬性等芥吟。

BeanDefinition接口的絕大多數(shù)功能都在AbstractBeanDefinition中實現(xiàn):

  // AbstractBeanDefinition.java
  @Nullable
  private volatile Object beanClass;

  @Nullable
  private String scope = SCOPE_DEFAULT;

  private boolean abstractFlag = false;

  private boolean lazyInit = false;

  private int autowireMode = AUTOWIRE_NO;

  private int dependencyCheck = DEPENDENCY_CHECK_NONE;

  @Nullable
  private String[] dependsOn;

  private boolean autowireCandidate = true;

  private boolean primary = false;

  private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<>();

  @Nullable
  private Supplier<?> instanceSupplier;

  private boolean nonPublicAccessAllowed = true;

  private boolean lenientConstructorResolution = true;

  @Nullable
  private String factoryBeanName;

  @Nullable
  private String factoryMethodName;

  @Nullable
  private ConstructorArgumentValues constructorArgumentValues;

  @Nullable
  private MutablePropertyValues propertyValues;

  @Nullable
  private MethodOverrides methodOverrides;

  @Nullable
  private String initMethodName;

  @Nullable
  private String destroyMethodName;

  private boolean enforceInitMethod = true;

  private boolean enforceDestroyMethod = true;

  private boolean synthetic = false;

  private int role = BeanDefinition.ROLE_APPLICATION;

  @Nullable
  private String description;

  @Nullable
  private Resource resource;

沒必要一個一個解讀了侦铜,這些屬性的作用可以說一目了然,實現(xiàn)中也沒有很復(fù)雜的邏輯钟鸵,知道BeanDefinition的作用之后钉稍,我們就可以去看spring的核心BeanFactory了~

當(dāng)然BeanDefinition的實現(xiàn)類不止文中提到的三種,還有例如對注解支持的實現(xiàn)類和對Configuration類的實現(xiàn)類棺耍,但是目的都差不多贡未,都是為了記錄一個Bean的各種配置信息。

最后提一嘴這個AttributeAccessor接口烈掠,這個接口在Spring中也是無處不在羞秤,比如包裝一個屬性的類PropertyValue類就實現(xiàn)了這個接口。這個接口里面僅僅封裝了一個Map<String, Object>左敌,但是其作用是什么我也是不是特別清楚瘾蛋,在調(diào)研和學(xué)習(xí)途中,也比較了"Attribute"這個詞和"Property"這兩者概念的區(qū)別矫限,但是發(fā)現(xiàn)google上權(quán)威的和非權(quán)威的各種解釋都有矛盾的地方哺哼,甚至在java的官方詞庫中都沒有發(fā)現(xiàn)"Attribute"這個詞佩抹,而只有"Property",AttributeAccessor接口本身的注釋也非常的含糊其辭取董。所以這個地方的合理性我覺得是存疑的棍苹,如果有大佬了解這部分內(nèi)容的,還請您不吝賜教茵汰。

Java官方詞庫:Glossary of Terms

其中對Property的解釋如下:

property

Characteristics of an object that users can set, such as the color of a window.

歡迎光臨我的個人博客:https://www.jelliclecat.cn/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枢里,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹂午,更是在濱河造成了極大的恐慌栏豺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豆胸,死亡現(xiàn)場離奇詭異奥洼,居然都是意外死亡,警方通過查閱死者的電腦和手機晚胡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門灵奖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人估盘,你說我怎么就攤上這事瓷患。” “怎么了忿檩?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵尉尾,是天一觀的道長。 經(jīng)常有香客問我燥透,道長沙咏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任班套,我火速辦了婚禮肢藐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吱韭。我一直安慰自己吆豹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布理盆。 她就那樣靜靜地躺著痘煤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猿规。 梳的紋絲不亂的頭發(fā)上衷快,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音姨俩,去河邊找鬼蘸拔。 笑死师郑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的调窍。 我是一名探鬼主播宝冕,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邓萨!你這毒婦竟也來了地梨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤先誉,失蹤者是張志新(化名)和其女友劉穎湿刽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褐耳,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年渴庆,在試婚紗的時候發(fā)現(xiàn)自己被綠了铃芦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡襟雷,死狀恐怖刃滓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耸弄,我是刑警寧澤咧虎,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站计呈,受9級特大地震影響砰诵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捌显,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一茁彭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扶歪,春花似錦理肺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炫欺,卻和暖如春乎完,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竣稽。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工囱怕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霍弹,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓娃弓,卻偏偏與公主長得像典格,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子台丛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容