spring的BeanFactory和ApplicationContext原始碼詳解(二)
轉自http://www.sandzhang.com/blog/2011/05/11/Spring-BeanFactory-ApplicationContext-Detail-2/
版本:spring-framework-3.0.5.RELEASE
接上篇繼續
一、首先看ConfigurableBeanFactory介面
本介面繼承了HierarchicalBeanFactory和SingletonBeanRegistry,介面程式碼如下:
[java] view plaincopyprint?- String SCOPE_SINGLETON = "singleton";
- String SCOPE_PROTOTYPE =
- void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
- void setBeanClassLoader(ClassLoader beanClassLoader);
- ClassLoader getBeanClassLoader();
- void setTempClassLoader(ClassLoader tempClassLoader);
- ClassLoader getTempClassLoader();
- void setCacheBeanMetadata(
- boolean isCacheBeanMetadata();
- void setBeanExpressionResolver(BeanExpressionResolver resolver);
- BeanExpressionResolver getBeanExpressionResolver();
- void setConversionService(ConversionService conversionService);
- ConversionService getConversionService();
- void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
- void registerCustomEditor(Class requiredType, Class<? extends PropertyEditor> propertyEditorClass);
- void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
- void setTypeConverter(TypeConverter typeConverter);
- TypeConverter getTypeConverter();
- void addEmbeddedValueResolver(StringValueResolver valueResolver);
- String resolveEmbeddedValue(String value);
- void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
- int getBeanPostProcessorCount();
- void registerScope(String scopeName, Scope scope);
- String[] getRegisteredScopeNames();
- Scope getRegisteredScope(String scopeName);
- AccessControlContext getAccessControlContext();
- void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
- void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
- void resolveAliases(StringValueResolver valueResolver);
- BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
- boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
- boolean isCurrentlyInCreation(String beanName);
- void registerDependentBean(String beanName, String dependentBeanName);
- String[] getDependentBeans(String beanName);
- String[] getDependenciesForBean(String beanName);
- void destroyBean(String beanName, Object beanInstance);
- void destroyScopedBean(String beanName);
- void destroySingletons();
String SCOPE_SINGLETON = "singleton";
String SCOPE_PROTOTYPE = "prototype";
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
void setBeanClassLoader(ClassLoader beanClassLoader);
ClassLoader getBeanClassLoader();
void setTempClassLoader(ClassLoader tempClassLoader);
ClassLoader getTempClassLoader();
void setCacheBeanMetadata(boolean cacheBeanMetadata);
boolean isCacheBeanMetadata();
void setBeanExpressionResolver(BeanExpressionResolver resolver);
BeanExpressionResolver getBeanExpressionResolver();
void setConversionService(ConversionService conversionService);
ConversionService getConversionService();
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
void registerCustomEditor(Class requiredType, Class<? extends PropertyEditor> propertyEditorClass);
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
void setTypeConverter(TypeConverter typeConverter);
TypeConverter getTypeConverter();
void addEmbeddedValueResolver(StringValueResolver valueResolver);
String resolveEmbeddedValue(String value);
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
int getBeanPostProcessorCount();
void registerScope(String scopeName, Scope scope);
String[] getRegisteredScopeNames();
Scope getRegisteredScope(String scopeName);
AccessControlContext getAccessControlContext();
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
void resolveAliases(StringValueResolver valueResolver);
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
boolean isCurrentlyInCreation(String beanName);
void registerDependentBean(String beanName, String dependentBeanName);
String[] getDependentBeans(String beanName);
String[] getDependenciesForBean(String beanName);
void destroyBean(String beanName, Object beanInstance);
void destroyScopedBean(String beanName);
void destroySingletons();
- 前面兩行是定義了spring裡bean的兩個作用域名稱:singleton和prototype,基本兩個的區別就是一為單例模式的一個物件,spring對其生命週期負責;二為每次請求都會生成新的物件,spring只負責建立,並不負責其生命週期管理。具體的作用域相關詳細分析請檢視 spring作用域分析
- 第4行設定ParentBeanFactory
- 第6-19行是標準的Javabean模板的Getter/Setter方法了,分別是對beanClassLoader(類載入器),tempClassLoader(臨時載入器),cacheBeanMetadata(是否快取bean的元資料),BeanExpressionResolver(表示式語言處理器),conversionService(資料轉換服務)的操作
- 第21行為新增bean屬性編輯器的管理器
- 第23行註冊某個型別requiredType的屬性編輯器為propertyEditorClass
- 第25行將所有當前已經註冊的屬性編輯器型別初始化並註冊到輸入引數registry中
- 第27-28行是typeConverter的Getter/Setter方法,這個物件是bean屬性的轉換器,會覆蓋propertyEditor機制
- 第30行新增字串解析器,主要用於嵌入式的屬性解析,例如註解中的屬性
- 第31行進行字串屬性解析,使用的就是上面新增的字串解析器
- 第33行註冊一個BeanPostProcessor
- 第34行獲取已經註冊的BeanPostProcessor的數量
- 第36-38行分別為註冊bean的作用域,獲取所有作用域名稱,根據名稱獲取作用域物件
- 第40行獲取安全管理上下文物件
- 第42行從傳入的otherFactory中獲取所有配置資訊(BeanPostProcessors,作用域等),但不包括具體的bean定義資訊
- 第44行註冊bean別名
- 第45行是使用傳入的valueResolver對別名進行處理
- 第47行根據beanName獲取bean定義資訊物件
- 第49行判斷指定name的bean是否為FactoryBean
- 第51行判斷指定name的bean是否正在建立中
- 第53行註冊dependentBeanName為beanName的依賴bean,在銷燬beanName對應的bean之前必須要先銷燬dependentBeanName對應的bean
- 第55-56行獲取所有依賴於beanName的bean名稱,以及獲取所有beanName依賴的bean名稱。
- 第58行銷燬bean例項
- 第59行把bean從其作用域中移除並銷燬
- 第60行銷燬所有單例bean
二、ConfigurableListableBeanFactory介面
本介面繼承了ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory,程式碼如下:
[java] view plaincopyprint?- void ignoreDependencyType(Class type);
- void ignoreDependencyInterface(Class ifc);
- void registerResolvableDependency(Class dependencyType, Object autowiredValue);
- boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
- throws NoSuchBeanDefinitionException;
- BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
- void freezeConfiguration();
- boolean isConfigurationFrozen();
- void preInstantiateSingletons() throws BeansException;
void ignoreDependencyType(Class type);
void ignoreDependencyInterface(Class ifc);
void registerResolvableDependency(Class dependencyType, Object autowiredValue);
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
throws NoSuchBeanDefinitionException;
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
void freezeConfiguration();
boolean isConfigurationFrozen();
void preInstantiateSingletons() throws BeansException;
- 第1行忽略指定型別的自動裝配,預設為空
- 第2行忽略指定介面的自動裝配,預設只忽略BeanFactoryAware介面
- 第4行這個還沒有弄清楚,弄清楚了再補上……
- 第6行判斷bean的依賴是否自動裝配
- 第9行根據beanname獲取bean的定義資訊物件
- 第11行第鎖住所有bean定義資訊,鎖住後將不允許對其修改
- 第12行判斷bean定義物件是否被鎖住
- 最後一行是確保對所有非延遲載入的單例bean進行初始化,也就是說在這裡會對所有沒有初始化的非延遲載入單例bean進行初始化。
三、ApplicationContext介面
本介面繼承了ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver,其中ListableBeanFactory是bean相關的列表功能,HierarchicalBeanFactory代表了它本身有層級支援,MessageSource代表了spring的國際化資訊支撐,ApplicationEventPublisher代表了spring的事件處理支撐,ResourcePatternResolver則是資源處理相關的支撐。介面程式碼如下:
[java] view plaincopyprint?- String getId();
- String getDisplayName();
- long getStartupDate();
- ApplicationContext getParent();
- AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
String getId();
String getDisplayName();
long getStartupDate();
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
- 這個程式碼就很簡單了,基本上的功能都是在幾個父接口裡,特殊的地方就是多幾個屬性id,displayName,startupDate,parentApplicationContext,autowireCapableBeanFactory的get或set方法
這裡簡單說下ApplicationContext雖然它是BeanFactory的子介面,但是可以認為它不是一個BeanFactory,ApplicationContext物件裡面包含了一個BeanFactory物件,相關bean基本功能是呼叫了其內部的一個BeanFactory物件來實現的,而不是自己進行的實現,它對BeanFactory進行了一定的封裝擴充套件,另外國際化支援,事件監聽等都整合在了裡面。