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

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

一. BeanDefinition介紹

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

Spring中Bean的配置來源可能很多,比如xml、@Service等注解標注的類、以及硬編碼等,這時需要一個統(tǒng)一的類去封裝Bean的配置信息,這些信息會指導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進行的,也可以說這兩個接口是孿生接口,誰也離不開誰。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)中也沒有很復雜的邏輯,知道BeanDefinition的作用之后,我們就可以去看spring的核心BeanFactory了~

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

最后提一嘴這個AttributeAccessor接口,這個接口在Spring中也是無處不在,比如包裝一個屬性的類PropertyValue類就實現(xiàn)了這個接口。這個接口里面僅僅封裝了一個Map<String, Object>,但是其作用是什么我也是不是特別清楚,在調(diào)研和學習途中,也比較了"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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容