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