主要分析的是Spring 启动的过程以及如何获取Bean对象
Spring 启动时读取应用程序提供的Bean 配置信息,并在Spring 容器中生成一份相应的Bean 配置注册表,然后根据这张注册表实例化Bean,装配好Bean 之间的依赖关系,为上层应用提供准备就绪的运行环境。

IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等。
Spring 中有两个主要的容器系列
1)实现BeanFactory 接口的简单容器;
2)实现ApplicationContext 接口的高级容器。
ApplicationContext 容器介绍
ApplicationContext 内部封装了一个BeanFactory 对象,来实现对容器的操作,BeanFactory封装了bean 的信息,而ApplicationContext 通过访问BeanFactory 对象获取bean 的对象信息ApplicationContext 也实现了一系列的BeanFactory 接口( 可以说ApplicationContext 对BeanFactory 对象实现一种代理)。 ApplicationContext 在应用这个DefaultListableBeanFactory 对象的基础上,不仅实现了 BeanFactory 接口提供的功能方法,并且黏合了一些面向应用的功能,如资源/国际化支持/ 框架事件支持等

其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory。但是从上图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。
那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这四个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为.
ApplicationContext 创建时 ,继承的所有父类
public interface ApplicationContext extends EnvironmentCapable,
ListableBeanFactory, //继承于BeanFactory
HierarchicalBeanFactory,//继承于BeanFactory
MessageSource, //
ApplicationEventPublisher,//
ResourcePatternResolver //继承ResourceLoader,
用于获取resource 对象
refresh()方法
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
在BeanFactory 子类中有一个DefaultListableBeanFactory 类,它包含了基本Spirng IoC容器所具有的重要功能,开发时不论是使用BeanFactory 系列还是ApplicationContext 系列来创建容器基本都会使用到DefaultListableBeanFactory 类,可以这么说,在spring 中实际上把它当成默认的IoC 容器来使用




