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,接口代码如下:

  1. String SCOPE_SINGLETON = "singleton"
  2. String SCOPE_PROTOTYPE = "prototype"
  3.   
  4. void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; 
  5.   
  6. void setBeanClassLoader(ClassLoader beanClassLoader); 
  7. ClassLoader getBeanClassLoader(); 
  8.   
  9. void setTempClassLoader(ClassLoader tempClassLoader); 
  10. ClassLoader getTempClassLoader(); 
  11.   
  12. void setCacheBeanMetadata(boolean cacheBeanMetadata); 
  13. boolean isCacheBeanMetadata(); 
  14.   
  15. void setBeanExpressionResolver(BeanExpressionResolver resolver); 
  16. BeanExpressionResolver getBeanExpressionResolver(); 
  17.   
  18. void setConversionService(ConversionService conversionService); 
  19. ConversionService getConversionService(); 
  20.   
  21. void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); 
  22.   
  23. void registerCustomEditor(Class requiredType, Class<? extends PropertyEditor> propertyEditorClass); 
  24.   
  25. void copyRegisteredEditorsTo(PropertyEditorRegistry registry); 
  26.   
  27. void setTypeConverter(TypeConverter typeConverter); 
  28. TypeConverter getTypeConverter(); 
  29.   
  30. void addEmbeddedValueResolver(StringValueResolver valueResolver); 
  31. String resolveEmbeddedValue(String value); 
  32.   
  33. void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); 
  34. int getBeanPostProcessorCount(); 
  35.   
  36. void registerScope(String scopeName, Scope scope); 
  37. String[] getRegisteredScopeNames(); 
  38. Scope getRegisteredScope(String scopeName); 
  39.   
  40. AccessControlContext getAccessControlContext(); 
  41.   
  42. void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); 
  43.   
  44. void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; 
  45. void resolveAliases(StringValueResolver valueResolver); 
  46.   
  47. BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; 
  48.   
  49. boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; 
  50.   
  51. boolean isCurrentlyInCreation(String beanName); 
  52.   
  53. void registerDependentBean(String beanName, String dependentBeanName); 
  54.   
  55. String[] getDependentBeans(String beanName); 
  56. String[] getDependenciesForBean(String beanName); 
  57.   
  58. void destroyBean(String beanName, Object beanInstance); 
  59. void destroyScopedBean(String beanName); 
  60. 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,代码如下:

  1. void ignoreDependencyType(Class type); 
  2. void ignoreDependencyInterface(Class ifc); 
  3.   
  4. void registerResolvableDependency(Class dependencyType, Object autowiredValue); 
  5.   
  6. boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) 
  7.         throws NoSuchBeanDefinitionException; 
  8.   
  9. BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; 
  10.   
  11. void freezeConfiguration(); 
  12. boolean isConfigurationFrozen(); 
  13.   
  14. 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则是资源处理相关的支撑。接口代码如下:

  1. String getId(); 
  2.   
  3. String getDisplayName(); 
  4.   
  5. long getStartupDate(); 
  6.   
  7. ApplicationContext getParent(); 
  8.   
  9. 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进行了一定的封装扩展,另外国际化支持,事件监听等都集成在了里面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值