1. 程式人生 > >spring的BeanFactory和ApplicationContext原始碼詳解(二)

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?
  1. String SCOPE_SINGLETON = "singleton";  
  2. String SCOPE_PROTOTYPE = 
    "prototype";  
  3. void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;  
  4. void setBeanClassLoader(ClassLoader beanClassLoader);  
  5. ClassLoader getBeanClassLoader();  
  6. void setTempClassLoader(ClassLoader tempClassLoader);  
  7. ClassLoader getTempClassLoader();  
  8. void setCacheBeanMetadata(
    boolean cacheBeanMetadata);  
  9. boolean isCacheBeanMetadata();  
  10. void setBeanExpressionResolver(BeanExpressionResolver resolver);  
  11. BeanExpressionResolver getBeanExpressionResolver();  
  12. void setConversionService(ConversionService conversionService);  
  13. ConversionService getConversionService();  
  14. void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);  
  15. void registerCustomEditor(Class requiredType, Class<? extends PropertyEditor> propertyEditorClass);  
  16. void copyRegisteredEditorsTo(PropertyEditorRegistry registry);  
  17. void setTypeConverter(TypeConverter typeConverter);  
  18. TypeConverter getTypeConverter();  
  19. void addEmbeddedValueResolver(StringValueResolver valueResolver);  
  20. String resolveEmbeddedValue(String value);  
  21. void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);  
  22. int getBeanPostProcessorCount();  
  23. void registerScope(String scopeName, Scope scope);  
  24. String[] getRegisteredScopeNames();  
  25. Scope getRegisteredScope(String scopeName);  
  26. AccessControlContext getAccessControlContext();  
  27. void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);  
  28. void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;  
  29. void resolveAliases(StringValueResolver valueResolver);  
  30. BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;  
  31. boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;  
  32. boolean isCurrentlyInCreation(String beanName);  
  33. void registerDependentBean(String beanName, String dependentBeanName);  
  34. String[] getDependentBeans(String beanName);  
  35. String[] getDependenciesForBean(String beanName);  
  36. void destroyBean(String beanName, Object beanInstance);  
  37. void destroyScopedBean(String beanName);  
  38. 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?
  1. void ignoreDependencyType(Class type);  
  2. void ignoreDependencyInterface(Class ifc);  
  3. void registerResolvableDependency(Class dependencyType, Object autowiredValue);  
  4. boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)  
  5. throws NoSuchBeanDefinitionException;  
  6. BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;  
  7. void freezeConfiguration();  
  8. boolean isConfigurationFrozen();  
  9. 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?
  1. String getId();  
  2. String getDisplayName();  
  3. long getStartupDate();  
  4. ApplicationContext getParent();  
  5. 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進行了一定的封裝擴充套件,另外國際化支援,事件監聽等都整合在了裡面。