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)工廠方法已經指定了,那么將覆蓋父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中的數(shù)組復制(clone與arraycopy)代碼詳解
這篇文章主要介紹了Java中的數(shù)組復制(clone與arraycopy)代碼詳解,本文并未全部介紹數(shù)組復制的幾種方式,僅對clone和copy的相關內容進行了解析,具有一定參考價值,需要的朋友可以了解下。2017-11-11
淺談SpringMVC中的session用法及細節(jié)記錄
下面小編就為大家?guī)硪黄獪\談SpringMVC中的session用法及細節(jié)記錄。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
JpaRepository如何實現(xiàn)增刪改查并進行單元測試
這篇文章主要介紹了JpaRepository如何實現(xiàn)增刪改查并進行單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java中構造方法set/get和toString的使用詳解
這篇文章主要介紹了Java中構造方法set/get和toString的使用詳解,構造函數(shù)的最大作用就是創(chuàng)建對象時完成初始化,當我們在new一個對象并傳入?yún)?shù)的時候,會自動調用構造函數(shù)并完成參數(shù)的初始化,需要的朋友可以參考下2019-07-07

