Spring的Bean注入解析結果BeanDefinition詳解
Bean注入解析結果BeanDefinition
BeanDefinition描述了一個bean實例,擁有屬性值、構造參數(shù)值和具體實現(xiàn)的其他信息,其是一個bean的元數(shù)據(jù),xml中配置的bean元素會被解析成BeanDefinition對象。
BeanDefinition的接口的結構類圖:
ChildBeanDefinition
可以讓子Bean定義擁有從父母哪里繼承配置的能力。相應的,子Bean定義有一個固定的依賴--他們的父bean定義。
一個子bean定義將繼承父母的構造參數(shù)值、屬性值和方法覆蓋并且可以選擇的增加新的值。 如果初始化方法、銷毀方法或者靜態(tài)工廠方法已經(jīng)指定了,那么將覆蓋父bean定義中的相關配置。 子bean定義保留的配置將是:依賴、自動裝配模式、依賴檢查、單例和延遲加載。
注意: 自從Spring 2.5之后, 編程的方式注冊bean定義的優(yōu)選方法是使用 GenericBeanDefinition類, 允許使用GenericBeanDefinition.setParentName方法動態(tài)的定義父依賴。 在大多數(shù)場景下可以 有效的取代ChildBeanDefinition類。
GenericBeanDefinition
GenericBeanDefinition是一個定義標準的bean定義的一站式服務。
像任何Bean定義,它允許指定一個類、可選的構造參數(shù)值和屬性值。 除此之外可以通過配置"parentName"屬性來靈活地指定從一個父Bean定義中派生。 通常來說,使用GenericBeanDefinition類為了注冊一個用戶可見的bean定義(后置處理器可能會操作它, 甚至可能重新配置父母的名字)。如果父/子關系是預設的建議使用RootBeanDefinition / ChildBeanDefinition。
RootBeanDefinition
RootBeanDefinition描述了Spring BeanFactory運行時合并后的特定Bean定義。
它可能來源于多個原始Bean定義(繼承自其他的bean定義,通常被注冊為GenericBeanDefinitions)。RootBeanDefinition從本質上將是運行時統(tǒng)一的Bean定義視圖。 在配置階段,RootBeanDefinition也可能用于注冊獨立的bean定義。然而,自從Spring2.5依賴,編程地注冊bean定義建議使用 GenericBeanDefinition類。GenericBeanDefinition在允許動態(tài)定義父依賴而不是硬編碼作為RootBeanDefinition方面有優(yōu)勢。
在抽象類AbstractBeanDefinition中添加了更多和bean屬性設置相關的處理操作。
@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(); }
總結
簡單來說BeanDefinition接口及其實現(xiàn)類就是bean的所有配置信息的一個數(shù)據(jù)集合,從類名也可以看出其就是一個bean的定義說明。
到此這篇關于Spring的Bean注入解析結果BeanDefinition詳解的文章就介紹到這了,更多相關Bean注入解析結果BeanDefinition內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java獲取http和https協(xié)議返回的json數(shù)據(jù)
本篇文章主要介紹了Java獲取http和https協(xié)議返回的json數(shù)據(jù) ,本篇文章提供兩個方法,幫助各位如何獲取http和https返回的數(shù)據(jù)。有興趣的可以了解一下。2017-01-01SpringBoot開發(fā)技巧啟動時配置校驗實現(xiàn)示例
這篇文章主要為大家介紹了SpringBoot開發(fā)在啟動時自動配置校驗的實現(xiàn)示例及原理解析,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10springboot整合dubbo設置全局唯一ID進行日志追蹤的示例代碼
這篇文章主要介紹了springboot整合dubbo設置全局唯一ID進行日志追蹤,本文通過圖文示例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Spring系列中的beanFactory與ApplicationContext
這篇文章主要介紹了Spring系列中的beanFactory與ApplicationContext,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09SpringMVC Mybatis配置多個數(shù)據(jù)源并切換代碼詳解
這篇文章主要介紹了SpringMVC Mybatis配置多個數(shù)據(jù)源并切換代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11有關ServletConfig與ServletContext的訪問
下面小編就為大家?guī)硪黄嘘PServletConfig與ServletContext的訪問。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01java中抽象類、抽象方法、接口與實現(xiàn)接口實例詳解
這篇文章主要給大家介紹了關于java中抽象類、抽象方法、接口與實現(xiàn)接口的相關資料,文中通過示例代碼將四者介紹的非常詳細,并且簡單介紹了抽象類和接口的區(qū)別,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。2017-11-11