Spring源码之BeanFactory一览
BeanFactory
BeanFactory是所有Spring Bean容器的基类。它定义了如下方法:
- 多个重载的getBean(...)方法
- 多个重载的getBeanProvider(...)方法
- 多个重载的isTypeMatch(...)方法
- isSingleton(String name)
- isPrototype(String name)
- getType(String name)
- getAliases(String name)
- containsBean(String name)
以上方法都是根据Bean的名称来检索Bean容器,来实现相应的功能。如:从容器中获取bean,判断bean的类型是否与给定的类型匹配,获取bean的别名等。
HierarchicalBeanFactory
HierarchicalBeanFactory定义了一个具有继承层次的Bean容器应该实现的两个基本方法
- getParentBeanFactory()
- containsLocalBean(String name)
💡 Tips: 这里,Spring没有定义setParentBeanFactory方法,而将该方法放到了_ConfigurableBeanFactory。_
ListableBeanFactory
ListableBeanFactory定义了更加丰富的对BeanFactory容器中内容进行检索的方法,方便用户使用。
- 检索BeanDefinition
- containsBeanDefinition(String beanName)
- getBeanDefinitionCount()
- getBeanDefinitionNames()
- 检索beanName
- String[] getBeanNamesForType(ResolvableType type);
- String[] getBeanNamesForType( Class type);
- String[] getBeanNamesForType( Class type, boolean includeNonSingletons, boolean allowEagerInit);
- String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
- 检索Bean
- getBeansOfType( Class
type) - getBeansOfType( Class
type, boolean includeNonSingletons, boolean allowEagerInit) - getBeansWithAnnotation(Class<? extends Annotation> annotationType)
- getBeansOfType( Class
💡 Tips:ListableBeanFactory中所有的方法都不考虑BeanFactory的继承层次。如果一个BeanFactory是一个HierarchicalBeanFactory,调用以上方法时只会在当前BeanFatory中进行检索,而不会去父BeanFactory中检索。而BeanFactory中定义的方法,必须考虑BeanFactory的继承层次,在调用beanFactory.getBean()时,会在当前BeanFactory中查找Bean,如果不存在,则交由父BeanFactory去查找。
AutowireCapableBeanFactory
AutowireCapableBeanFactory定义了实现容器自动装配功能标准方法。这些方法的实现与Bean的声明周期关系密切。Spring将Bean的创建分为三个阶段,实例化、属性填充和初始化。具体请参考SpringBean创建流程
- 创建Bean
- createBean(Class
beanClass)
- createBean(Class
根据给定类名创建一个类实例,并执行完全的Bean创建流程(实例化、属性填充和初始化),但在属性填充阶段不会进行byName或ByType自动装配,但是有Autowired或Value注解的字段会自动装配
- createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck)
根据给定类名创建一个类实例,并执行完全的Bean创建流程(实例化、属性填充和初始化),并根据autowireMode指定在属性填充阶段是否进行自动装配,以及是否进行依赖检查
- 装配Bean
- autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck)
根据给定类名创建一个类实例,并根据autowireMode指定在属性填充阶段是否进行自动装配,以及是否进行依赖检查。但是不会进行初始化操作。其实就是只有实例化和属性填充两个阶段。
- autowireBean(Object existingBean)
填充Bean属性。对于给定的Bean,只执行属性填充这个阶段,实例化和初始化阶段的所有过程都不会执行。且在属性填充阶段不会进行byName或ByType自动装配。其实就是调用了populateBean
- configureBean(Object existingBean, String beanName)
配置Bean。对于给定的Bean,执行属性填充和初始化这个阶段。同样不会执行ByName和ByType自动装配。
- autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
装配Bean属性。只执行属性填充阶段,不执行初始化阶段。
- applyBeanPropertyValues(Object existingBean, String beanName)
根据beanName加载bean的定义,然后根据bean定义的propertyValues对existingBean中的属性进行赋值。相当于只执行属性填充阶段里面 applyPropertyValues这一个步骤
- initializeBean(Object existingBean, String beanName)
只执行初始化Bean这个阶段。
- applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
调用BeanPostProcessor的postProcessBeforeInitialization方法
- applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
调用BeanPostProcessor的postProcessAfterInitialization方法
💡 Tips:
这里 你是否疑惑autowireMode与Autowired注解有什么关系?
基于Autowired注解的自动装配很常用,如果Bean的属性上有Autowired注解,Spring容器会自动进行依赖注入。
autowireMode:定义Bean的自动装配模式。一般有ByName和ByType两种自动装配模式,如果Bean的属性上没有Autowired注解也没有Value注解,用户又希望创建Bean时能够进行依赖注入,就可以指定依赖注入的模式,Spring也会自动完成依赖注入。基于ByName和ByType的自动装配几乎已经不再使用了,现在有了依赖解析替代(基于注解解析或工厂方法解析)。
dependencyCheck依赖检查又是做什么事情呢?
如果Bean创建完成(自动装配也完成了)后,还有属性没有设置值呢?dependencyCheck就是做这个依赖检查的,如果dependencyCheck是true且Bean创建完成后依然还有Bean属性没有设置值,就会根据Bean配置的依赖检查方式进行依赖检查。Bean的依赖检查方式有四种:none、simple、object、all
none:不进行依赖检查
simple:只检查基本类型属性
object: 只检查基本属性以外的引用类型
all:检查所有类型
- 解析Bean 主要用于完成Bean的依赖解析
- NamedBeanHolder
resolveNamedBean(Class requiredType)
- NamedBeanHolder
根据类型在容器中查找Bean
- Object resolveBeanByName(String name, DependencyDescriptor descriptor)
- Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName)
- Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, Set
autowiredBeanNames, TypeConverter typeConverter)
- 销毁Bean
- destroyBean(Object existingBean)
指定destory阶段
理解AutowireCapableBeanFactory对于理解Bean的创建过程有极大帮助,请读者仔细揣摩。
ConfigurableBeanFactory
定义了配置BeanFactory时需要的接口以及一些附加功能接口。
- BeanFactory的配置接口
- setParentBeanFactory
- setBeanClassLoader
- setTempClassLoader
- setBeanExpressionResolver
- setConversionService
- addPropertyEditorRegistrar
- registerCustomEditor
- setTypeConverter
- addEmbeddedValueResolver
- addBeanPostProcessor
- registerScope
- 附加功能接口
- registerAlias(String beanName, String alias)
- resolveAliases(StringValueResolver valueResolver)
- BeanDefinition getMergedBeanDefinition(String beanName)
- registerDependentBean(String beanName, String dependentBeanName)
- getDependentBeans(String beanName)
- getDependenciesForBean(String beanName)
- destroyBean(String beanName, Object beanInstance)
- destroyScopedBean(String beanName)
- destroySingletons()
这里为BeanFactory配置的每个基础设施都可以作为一个专题进行研究。
ConfigurableListableBeanFactory
- 自动装配相关的配置接口
- ignoreDependencyType(Class<?> type) 在自动装配时忽略指定的类
- ignoreDependencyInterface(Class<?> ifc) 在自动装配时忽略指定的接口
- registerResolvableDependency 指定装配时,某个类型使用的对象
- 获取bean相关信息的接口
- isAutowireCandidate 判断一个类是不是允许作为候选bean被注入到其他bean中
- getBeanDefinition(String beanName)获取一个bean的BeanDefination
- clearMetadataCache 清除BeanDeifination的元数据信息
- freezeConfiguration 冻结BeanDefination配置 一旦冻结,就不再允许修改
- preInstantiateSingletons 预初始化所有非懒加载的bean

浙公网安备 33010602011771号