Spring源码之BeanFactory一览

Untitled.png

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容器中内容进行检索的方法,方便用户使用。

  1. 检索BeanDefinition
    • containsBeanDefinition(String beanName)
    • getBeanDefinitionCount()
    • getBeanDefinitionNames()
  2. 检索beanName
    • String[] getBeanNamesForType(ResolvableType type);
    • String[] getBeanNamesForType( Class type);
    • String[] getBeanNamesForType( Class type, boolean includeNonSingletons, boolean allowEagerInit);
    • String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
  3. 检索Bean
    • getBeansOfType( Class type)
    • getBeansOfType( Class type, boolean includeNonSingletons, boolean allowEagerInit)
    • getBeansWithAnnotation(Class<? extends Annotation> annotationType)

💡 Tips:ListableBeanFactory中所有的方法都不考虑BeanFactory的继承层次。如果一个BeanFactory是一个HierarchicalBeanFactory,调用以上方法时只会在当前BeanFatory中进行检索,而不会去父BeanFactory中检索。而BeanFactory中定义的方法,必须考虑BeanFactory的继承层次,在调用beanFactory.getBean()时,会在当前BeanFactory中查找Bean,如果不存在,则交由父BeanFactory去查找。

AutowireCapableBeanFactory

AutowireCapableBeanFactory定义了实现容器自动装配功能标准方法。这些方法的实现与Bean的声明周期关系密切。Spring将Bean的创建分为三个阶段,实例化、属性填充和初始化。具体请参考SpringBean创建流程

  1. 创建Bean
    • createBean(Class beanClass)

根据给定类名创建一个类实例,并执行完全的Bean创建流程(实例化、属性填充和初始化),但在属性填充阶段不会进行byName或ByType自动装配,但是有Autowired或Value注解的字段会自动装配

  • createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck)

根据给定类名创建一个类实例,并执行完全的Bean创建流程(实例化、属性填充和初始化),并根据autowireMode指定在属性填充阶段是否进行自动装配,以及是否进行依赖检查

  1. 装配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:检查所有类型

  1. 解析Bean 主要用于完成Bean的依赖解析
    • NamedBeanHolder resolveNamedBean(Class requiredType)

根据类型在容器中查找Bean

  • Object resolveBeanByName(String name, DependencyDescriptor descriptor)
  • Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName)
  • Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, Set autowiredBeanNames, TypeConverter typeConverter)
  1. 销毁Bean
    • destroyBean(Object existingBean)

指定destory阶段
理解AutowireCapableBeanFactory对于理解Bean的创建过程有极大帮助,请读者仔细揣摩。

ConfigurableBeanFactory

定义了配置BeanFactory时需要的接口以及一些附加功能接口。

  1. BeanFactory的配置接口
    • setParentBeanFactory
    • setBeanClassLoader
    • setTempClassLoader
    • setBeanExpressionResolver
    • setConversionService
    • addPropertyEditorRegistrar
    • registerCustomEditor
    • setTypeConverter
    • addEmbeddedValueResolver
    • addBeanPostProcessor
    • registerScope
  2. 附加功能接口
    • 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

  1. 自动装配相关的配置接口
    • ignoreDependencyType(Class<?> type) 在自动装配时忽略指定的类
    • ignoreDependencyInterface(Class<?> ifc) 在自动装配时忽略指定的接口
    • registerResolvableDependency 指定装配时,某个类型使用的对象
  2. 获取bean相关信息的接口
    • isAutowireCandidate 判断一个类是不是允许作为候选bean被注入到其他bean中
    • getBeanDefinition(String beanName)获取一个bean的BeanDefination
    • clearMetadataCache 清除BeanDeifination的元数据信息
    • freezeConfiguration 冻结BeanDefination配置 一旦冻结,就不再允许修改
    • preInstantiateSingletons 预初始化所有非懒加载的bean
posted @ 2023-01-31 15:23  小张同学哈  阅读(87)  评论(0)    收藏  举报