spring的BeanFactory和ApplicationContext源码详解(二)
来源:互联网 发布:python读取nc文件 编辑:程序博客网 时间:2024/05/21 12:52
转自http://www.sandzhang.com/blog/2011/05/11/Spring-BeanFactory-ApplicationContext-Detail-2/
版本:spring-framework-3.0.5.RELEASE
接上篇继续
一、首先看ConfigurableBeanFactory接口
本接口继承了HierarchicalBeanFactory和SingletonBeanRegistry,接口代码如下:
- 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();
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,代码如下:
- 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则是资源处理相关的支撑。接口代码如下:
- 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进行了一定的封装扩展,另外国际化支持,事件监听等都集成在了里面。
- spring的BeanFactory和ApplicationContext源码详解(二)
- spring的BeanFactory和ApplicationContext源码详解(二)
- spring的BeanFactory和ApplicationContext源码详解(二)
- spring的BeanFactory和ApplicationContext源码详解(一)
- spring的BeanFactory和ApplicationContext源码详解(一)
- spring的BeanFactory和ApplicationContext源码详解(一)
- spring的BeanFactory 和ApplicationContext详解
- spring BeanFactory和ApplicationContext详解
- ApplicationContext和BeanFactory的区别-----spring源码心得
- Spring中BeanFactory和ApplicationContext的生命周期及其区别详解
- Spring--BeanFactory和ApplicationContext
- Spring--BeanFactory和ApplicationContext
- spring的BeanFactory和ApplicationContext的区别
- spring感悟(一)BeanFactory和applicationContext的异同
- Spring的简单使用BeanFactory和ApplicationContext
- spring---ApplicationContext和BeanFactory的比较
- Spring的BeanFactory和ApplicationContext 第一章:类图
- Spring的接口BeanFactory和ApplicationContext
- memcpy函数拷贝时候遇到的虚拟地址与物理地址问题
- 在eclipse下创建一个helloworld小程序
- Python 调试工具
- 撇清POJO 和JavaBean的关系
- Shift命令的使用
- spring的BeanFactory和ApplicationContext源码详解(二)
- oracle 11g安装图解
- sql server2012 功能
- iOS ASIHTTPRequest详解
- Maven中引入Java串口comm包遇到的问题
- 启动ibus
- 2013 Asia Hangzhou Regional Contest hdu4780 Candy Factory
- DBNEWID 使用一:更改DBID (数据库里的各个基本概念易混淆的 看该博主)
- WordPress模板标签大全