阿里巴巴|Spring源码之——有BeanDefinition才有Bean

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片

阿里巴巴|Spring源码之——有BeanDefinition才有Bean

文章图片


我们知道Spring的可用通过多种方式进行配置:XML配置文件、Groovy配置文件、注解配置、Java代码配置 。 无论什么样的形式的配置都要先被解析成初始化Bean所需要的各种元信息(Metadata) , 也就是BeanDefinition对象
我们重点关注org.springframework.context.support.AbstractApplicationContext#refresh中调用的

注释写的简单 , 告诉子类来刷新内部的beanFactory , 返回被刷新的BeanFactory实例
getBeanFactory就是返回已经实例化好的beanFactory , 比较简单 。 所以我们重点关注refreshBeanFactory

以上 , 很清楚的看到创建刷新BeanFactory的几个关键事项:1.创建BeanFactory实例createBeanFactory()
2.留给子类扩展 , 对BeanFactory做一些个性化设置customizeBeanFactory(beanFactory)
3.加载BeanDefinitionloadBeanDefinitions(beanFactory)
BeanFactory的实例化

先来看BeanFactory的创建注释写的很清楚 , 为context创建一个beanFactory , 因为创建的是DefaultListableBeanFactory的实例 , 在下一步customizeBeanFactory(beanFactory)中 , 我们就可以调用它的一些方法来设置是否允许BeanDefinition定义覆盖、是否允许循环引用等 , 然后在AbstractAutowireCapableBeanFactory的构造器中 , 设置了几个Aware类的依赖注入检查

在AbstractAutowireCapableBeanFactory中设置了父BeanFactory(如果有的话)
还记得我们创建的BeanFactory是new的那个子类吗?对 , 是`` , 我们也可以通过类图来大概看一下它具备那些能力和属性
解释一个几个Registry(注册器)
?AliasRegistry 要求子类实现提供别名的管理能力(注册、查询等接口)
【阿里巴巴|Spring源码之——有BeanDefinition才有Bean】?BeanDefinitionRegistry 要求子类实现提供BeanDefinitition的管理能力
?SingletonBeanRegistry 要求子类实现提供单例Bean的管理能力
所有new出来的这个DefaultListableBeanFactory就必定有这些相关的接口
对BeanFactory的个性化设置

上面已经提到过了 , 我们列举几个典型的可被覆盖的BeanFactory属性?setAllowBeanDefinitionOverriding 是否允许BeanDefinition覆盖 , 有多个配置来源时可能会产生命名冲突等 , 这个设置也对Bean的别名覆盖生效 。 为false时 , 如果有冲突会抛异常