歡迎光臨我的個人博客: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)

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/