Spring的Bean注入解析結(jié)果BeanDefinition詳解
Bean注入解析結(jié)果BeanDefinition
BeanDefinition描述了一個(gè)bean實(shí)例,擁有屬性值、構(gòu)造參數(shù)值和具體實(shí)現(xiàn)的其他信息,其是一個(gè)bean的元數(shù)據(jù),xml中配置的bean元素會(huì)被解析成BeanDefinition對(duì)象。
BeanDefinition的接口的結(jié)構(gòu)類(lèi)圖:
ChildBeanDefinition
可以讓子Bean定義擁有從父母哪里繼承配置的能力。相應(yīng)的,子Bean定義有一個(gè)固定的依賴(lài)--他們的父bean定義。
一個(gè)子bean定義將繼承父母的構(gòu)造參數(shù)值、屬性值和方法覆蓋并且可以選擇的增加新的值。 如果初始化方法、銷(xiāo)毀方法或者靜態(tài)工廠方法已經(jīng)指定了,那么將覆蓋父bean定義中的相關(guān)配置。 子bean定義保留的配置將是:依賴(lài)、自動(dòng)裝配模式、依賴(lài)檢查、單例和延遲加載。
注意: 自從Spring 2.5之后, 編程的方式注冊(cè)bean定義的優(yōu)選方法是使用 GenericBeanDefinition類(lèi), 允許使用GenericBeanDefinition.setParentName方法動(dòng)態(tài)的定義父依賴(lài)。 在大多數(shù)場(chǎng)景下可以 有效的取代ChildBeanDefinition類(lèi)。
GenericBeanDefinition
GenericBeanDefinition是一個(gè)定義標(biāo)準(zhǔn)的bean定義的一站式服務(wù)。
像任何Bean定義,它允許指定一個(gè)類(lèi)、可選的構(gòu)造參數(shù)值和屬性值。 除此之外可以通過(guò)配置"parentName"屬性來(lái)靈活地指定從一個(gè)父Bean定義中派生。 通常來(lái)說(shuō),使用GenericBeanDefinition類(lèi)為了注冊(cè)一個(gè)用戶(hù)可見(jiàn)的bean定義(后置處理器可能會(huì)操作它, 甚至可能重新配置父母的名字)。如果父/子關(guān)系是預(yù)設(shè)的建議使用RootBeanDefinition / ChildBeanDefinition。
RootBeanDefinition
RootBeanDefinition描述了Spring BeanFactory運(yùn)行時(shí)合并后的特定Bean定義。
它可能來(lái)源于多個(gè)原始Bean定義(繼承自其他的bean定義,通常被注冊(cè)為GenericBeanDefinitions)。RootBeanDefinition從本質(zhì)上將是運(yùn)行時(shí)統(tǒng)一的Bean定義視圖。 在配置階段,RootBeanDefinition也可能用于注冊(cè)獨(dú)立的bean定義。然而,自從Spring2.5依賴(lài),編程地注冊(cè)bean定義建議使用 GenericBeanDefinition類(lèi)。GenericBeanDefinition在允許動(dòng)態(tài)定義父依賴(lài)而不是硬編碼作為RootBeanDefinition方面有優(yōu)勢(shì)。
在抽象類(lèi)AbstractBeanDefinition中添加了更多和bean屬性設(shè)置相關(guān)的處理操作。
@SuppressWarnings("serial") public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable { public static final String SCOPE_DEFAULT = ""; public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO; public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME; public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE; public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR; @Deprecated public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT; public static final int DEPENDENCY_CHECK_NONE = 0; public static final int DEPENDENCY_CHECK_OBJECTS = 1; public static final int DEPENDENCY_CHECK_SIMPLE = 2; public static final int DEPENDENCY_CHECK_ALL = 3; public static final String INFER_METHOD = "(inferred)"; private volatile Object beanClass; private String scope = SCOPE_DEFAULT; private boolean abstractFlag = false; private boolean lazyInit = false; private int autowireMode = AUTOWIRE_NO; private int dependencyCheck = DEPENDENCY_CHECK_NONE; private String[] dependsOn; private boolean autowireCandidate = true; private boolean primary = false; private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<String, AutowireCandidateQualifier>(0); private boolean nonPublicAccessAllowed = true; private boolean lenientConstructorResolution = true; private ConstructorArgumentValues constructorArgumentValues; private MutablePropertyValues propertyValues; private MethodOverrides methodOverrides = new MethodOverrides(); private String factoryBeanName; private String factoryMethodName; private String initMethodName; private String destroyMethodName; private boolean enforceInitMethod = true; private boolean enforceDestroyMethod = true; private boolean synthetic = false; private int role = BeanDefinition.ROLE_APPLICATION; private String description; private Resource resource; .........//屬性處理代碼 }
BeanDefinition源碼
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE; int ROLE_APPLICATION = 0; int ROLE_SUPPORT = 1; int ROLE_INFRASTRUCTURE = 2; String getParentName(); void setParentName(String parentName); String getBeanClassName(); void setBeanClassName(String beanClassName); String getFactoryBeanName(); void setFactoryBeanName(String factoryBeanName); String getFactoryMethodName(); void setFactoryMethodName(String factoryMethodName); String getScope(); void setScope(String scope); boolean isLazyInit(); void setLazyInit(boolean lazyInit); String[] getDependsOn(); void setDependsOn(String... dependsOn); boolean isAutowireCandidate(); void setAutowireCandidate(boolean autowireCandidate); boolean isPrimary(); void setPrimary(boolean primary); ConstructorArgumentValues getConstructorArgumentValues(); MutablePropertyValues getPropertyValues(); boolean isSingleton(); boolean isPrototype(); boolean isAbstract(); int getRole(); String getDescription(); String getResourceDescription(); BeanDefinition getOriginatingBeanDefinition(); }
總結(jié)
簡(jiǎn)單來(lái)說(shuō)BeanDefinition接口及其實(shí)現(xiàn)類(lèi)就是bean的所有配置信息的一個(gè)數(shù)據(jù)集合,從類(lèi)名也可以看出其就是一個(gè)bean的定義說(shuō)明。
到此這篇關(guān)于Spring的Bean注入解析結(jié)果BeanDefinition詳解的文章就介紹到這了,更多相關(guān)Bean注入解析結(jié)果BeanDefinition內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java獲取http和https協(xié)議返回的json數(shù)據(jù)
本篇文章主要介紹了Java獲取http和https協(xié)議返回的json數(shù)據(jù) ,本篇文章提供兩個(gè)方法,幫助各位如何獲取http和https返回的數(shù)據(jù)。有興趣的可以了解一下。2017-01-01SpringBoot開(kāi)發(fā)技巧啟動(dòng)時(shí)配置校驗(yàn)實(shí)現(xiàn)示例
這篇文章主要為大家介紹了SpringBoot開(kāi)發(fā)在啟動(dòng)時(shí)自動(dòng)配置校驗(yàn)的實(shí)現(xiàn)示例及原理解析,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10springboot整合dubbo設(shè)置全局唯一ID進(jìn)行日志追蹤的示例代碼
這篇文章主要介紹了springboot整合dubbo設(shè)置全局唯一ID進(jìn)行日志追蹤,本文通過(guò)圖文示例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Spring系列中的beanFactory與ApplicationContext
這篇文章主要介紹了Spring系列中的beanFactory與ApplicationContext,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09SpringMVC Mybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解
這篇文章主要介紹了SpringMVC Mybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11有關(guān)ServletConfig與ServletContext的訪(fǎng)問(wèn)
下面小編就為大家?guī)?lái)一篇有關(guān)ServletConfig與ServletContext的訪(fǎng)問(wèn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01java中抽象類(lèi)、抽象方法、接口與實(shí)現(xiàn)接口實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于java中抽象類(lèi)、抽象方法、接口與實(shí)現(xiàn)接口的相關(guān)資料,文中通過(guò)示例代碼將四者介紹的非常詳細(xì),并且簡(jiǎn)單介紹了抽象類(lèi)和接口的區(qū)別,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11