本文共 6630 字,大约阅读时间需要 22 分钟。
BeanFactory是接入spring-bean容器的基本客户端视图。有比较复杂的实现。其中,bean的完整初始化顺序如下:具体请参照BeanFactory源码
*
- BeanNameAware's {@code setBeanName} *
- BeanClassLoaderAware's {@code setBeanClassLoader} *
- BeanFactoryAware's {@code setBeanFactory} *
- EnvironmentAware's {@code setEnvironment} *
- EmbeddedValueResolverAware's {@code setEmbeddedValueResolver} *
- ResourceLoaderAware's {@code setResourceLoader} * (only applicable when running in an application context) *
- ApplicationEventPublisherAware's {@code setApplicationEventPublisher} * (only applicable when running in an application context) *
- MessageSourceAware's {@code setMessageSource} * (only applicable when running in an application context) *
- ApplicationContextAware's {@code setApplicationContext} * (only applicable when running in an application context) *
- ServletContextAware's {@code setServletContext} * (only applicable when running in a web application context) *
- {@code postProcessBeforeInitialization} methods of BeanPostProcessors *
- InitializingBean's {@code afterPropertiesSet} *
- a custom init-method definition *
- {@code postProcessAfterInitialization} methods of BeanPostProcessors *
以上是初始化方法和他们的标准顺序,主要是各种aware接口和BeanPostProcessors流程。本章将不做过多介绍,后续章节会对部分流程,结合Bean的初始化流程进行解析。
先来看一下BeanFactory为我们提供的基本视图:
//通过bean的名字获取bean对象 Object getBean(String name) throws BeansException; //根据bean的类型和名字获取bean对象T getBean(String name, Class requiredType) throws BeansException; //根据bean的名字和构造参数工厂方法参数获取bean Object getBean(String name, Object... args) throws BeansException; //通过bean的类型获取bean T getBean(Class requiredType) throws BeansException; //根据类型和参数获取bean T getBean(Class requiredType, Object... args) throws BeansException; //获取bean的提供者 ObjectProvider getBeanProvider(Class requiredType); //指定类型的bean提供者 ObjectProvider getBeanProvider(ResolvableType requiredType); //包含bean boolean containsBean(String name); //是否是单列 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; //非单列 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; //类型是否匹配 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; //类型是否匹配 boolean isTypeMatch(String name, Class typeToMatch) throws NoSuchBeanDefinitionException; //查询类型 @Nullable Class getType(String name) throws NoSuchBeanDefinitionException; //bean的别名 String[] getAliases(String name);
BeanFactory的直接子接口有三个:
HierarchicalBeanFactory //支持BeanFactory继承功能 AutowireCapableBeanFactory //定义自动注入以及bean的创建和执行标准初始化方法接口 ListableBeanFactory //列举当前BeanFactory的bean接下来详细看一下ConfigurableBeanFactory提供了那些功能,这个接口方法比较多,但是比较重要,他是整个容器的配置,所有的可配置功能,都可以反映出来:
interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry//继承自HierarchicalBeanFactory,SingletonBeanRegistry,可支持BeanFactory层次以及注册单列标准单列域 String SCOPE_SINGLETON = "singleton";prototype域 String SCOPE_PROTOTYPE = "prototype";设置自己的父beanfactory void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; 设置类加载器用于加载class void setBeanClassLoader(@Nullable ClassLoader beanClassLoader); 返回classloader @Nullable ClassLoader getBeanClassLoader();特殊的类加载器一般用于load-time weaving,加载时织入功能,可实现aop void setTempClassLoader(@Nullable ClassLoader tempClassLoader); 获取临时类加载器 ClassLoader getTempClassLoader(); 设置是否缓存bean的元数据信息,如果关闭功能,每次创建bean都会重新加载bean元数据信息 void setCacheBeanMetadata(boolean cacheBeanMetadata);是否缓存元数据信息 boolean isCacheBeanMetadata(); 表达式解析器如支持#{...} void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver); 获取表达式解析器 @Nullable BeanExpressionResolver getBeanExpressionResolver(); 安全转换服务,可参照类型安全转换章节 void setConversionService(@Nullable ConversionService conversionService); 获取类型转换服务 ConversionService getConversionService(); 属性编辑器注册 void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);注册自定义属性编辑器 void registerCustomEditor(Class requiredType, Class propertyEditorClass);复制属性编辑器 void copyRegisteredEditorsTo(PropertyEditorRegistry registry);类型转换 void setTypeConverter(TypeConverter typeConverter); 获取类型转换 TypeConverter getTypeConverter(); 值解析 void addEmbeddedValueResolver(StringValueResolver valueResolver); 是否有值解析器 boolean hasEmbeddedValueResolver(); 解析值返回解析结果,如注解 @Nullable String resolveEmbeddedValue(String value); 添加后置处理流程 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); 获取后置处理器数量 int getBeanPostProcessorCount(); 注册自定义域 void registerScope(String scopeName, Scope scope); 获取自注册域名字 String[] getRegisteredScopeNames(); 通过名字获取注册域 @Nullable Scope getRegisteredScope(String scopeName); 安全接入控制上下文 AccessControlContext getAccessControlContext(); 从执行beanfactory复制配置信息 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); 为指定的beanName注册别名 void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; 占位符解析 void resolveAliases(StringValueResolver valueResolver); 获取合并bean定义 BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; 判断bean是否是FactoryBean boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; 设置当前bean在创建中 void setCurrentlyInCreation(String beanName, boolean inCreation);当前bean是否在创建中 boolean isCurrentlyInCreation(String beanName); beanName被dependentBeanName依赖 void registerDependentBean(String beanName, String dependentBeanName);获取被依赖bean String[] getDependentBeans(String beanName); 获取依赖bean String[] getDependenciesForBean(String beanName); 销毁bean void destroyBean(String beanName, Object beanInstance);销毁域中的bean void destroyScopedBean(String beanName); 销毁单列 void destroySingletons();
集成式的接口interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory 主要是内部实现会使用改接口的方法,大体看一下该接口的方法,方便后面源码分析:忽略指定类型的依赖,比如String void ignoreDependencyType(Class type); 忽略依赖的接口,比如BeanFactory通过BeanFactoryAware接口注入 void ignoreDependencyInterface(Class ifc);注册为可解析依赖 void registerResolvableDependency(Class dependencyType, @Nullable Object autowiredValue); 是否是候选注入,主要是同类型bean不同名字时使用 boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;查询bean定义 BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; 返回当前BeanFactory所有名字的迭代器 IteratorgetBeanNamesIterator(); 清除缓存元数据 void clearMetadataCache(); 冻结当前配置,将不能再更新 void freezeConfiguration(); 配置是否冻结 boolean isConfigurationFrozen(); 确保非懒加载单列都实例话了 void preInstantiateSingletons() throws BeansException;
本节主要介绍了BeanFactory体现通过各个接口提供的功能,下一节将要介绍其主要实现AbstractBeanFactory,以及其自实现。
转载地址:http://yduti.baihongyu.com/