Spring源码
大致流程:Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系,为上层应用提供准备就绪的运行环境。
1.Spring 中 IOC 容器分类
Spring 中有两个主要的容器系列:
1)实现 BeanFactory 接口的简单容器;
2)实现 ApplicationContext 接口的高级容器。
refresh方法是整个Spring容器的入口 点去进
上面红色标注的是refresh中比较重要的方法obtainFreshBeanFactory 创建bean工厂 如果存在则销毁 不存在则创建
if判断是否已经存在容器,如果存在则销毁,创建一个新的容器
DefaultListableBeanFactory中的beanDefinitionMap 上图已经标注出来了 其实就是前面一开始提到的bean的注册表,现在还是空的,在解析配置文件的时候才会有值:
DefaultListableBeanFactory 是BeanFactory 子类,它包含了基本 Spirng IoC容器所具有的重要功能,开发时不论是使用 BeanFactory 系列还是 ApplicationContext 系列来创建容器基本都会使用到 DefaultListableBeanFactory 类,可以这么说,在 spring 中实际上把它当成默认的 IoC 容器来使用
第一步已经执行完毕 ,下面需要加载配置文件 将刚刚创建的DefaultListableBeanFactory 对象传入作为参数
首先创建一个解析器 并完成初始化
第一个是走我们自定义的 资源,第二个是走容器自身资源 ,所以会走第二个
做一个location做一个遍历,这个location其实就是我们传过来的配置文件,每循坏一次又调用leadBeanDefinition
将IO流传到inputSource里面 spring用的这种方式解析的xml文件
创建document对象
** documentReader.registerBeanDefinitions(doc, this.createReaderContext(resource))会取到根节点**
preProcessXml 解析前缀
parseBeanDefinitions解析标签
postProcessXml解析后缀
**开始解析XML文件 **
如果标签是bean 会执行processBeanDefinition
**BeanDefinitionHolder 可以理解为对解析出来的结果的定义,并且能够完成将解析出来的结果注册到Spring容器中
得到bean的名字
**判断容器中是否存在bean对象
将结果放入容器中 beanDefinitionMap,但是现在只是完成了注册并没有完成实例化
回到入口
如果不是懒加载,就会创建实例化bean,从之前存入的集合中取出需要被实例化的bean对象的名字
到这里我们的Spring容器初始化bean完成 ,第一次学习Spring源码 仅记录学习过程!!!!!