1.二者简介

Bean工厂(BeanFactory)是Spring框架的最核心接口,它提供了高级Ioc的配置机制。应用上下文(ApplicationContext)是BeanFactory的实现,以Bean工厂为基础,它提供了更多面向应用的功能。

在用途上,BeanFactory是Spring框架的基础设施,面向Spring本身,我们一般不直接使用;ApplicationContext面向使用Spring框架的开发者,所以,在几乎所有的应用场合我们都使用应用上下文而非Bean工厂。

我们一般称BeanFactory为IOC容器,为了方便,也称ApplicationContext为Spring容器。下面是它俩的实现关系:

2.BeanFactory

BeanFactory是一个工厂类,但与我们平时在工厂模式中使用的工厂类不同,BeanFactory除了能够创建对象之外,还能够管理对象,而被Spring管理的对象,我们称之为Bean。它最核心的方法就是getBean(String beanName),该方法从容器中返回特定名称的Bean

3.ApplicationContext

如果说BeanFactory(BF)是Spring的心脏,那么ApplicationContext(AC)就是完整的身躯了。如上图所示,AC是由BF派生而来的,提供了更多BF不具有的,面向实际应用的功能。 它的实现类主要有:

我们主要使用的实现类有三个:

  • AnnotationConfigApplicationContext:它用于读取通过注解创建容器的配置
  • ClassPathXmlApplicationContext:它用于加载类路径下的配置文件,更常用。
  • FileSystemXmlApplicationContext:他可以加载磁盘下任意路径下的配置文件,前提是必须有该文件的访问权限。

4.二者区别

二者最主要的区别在于创建Bean对象的时间:

  • AC在构建核心容器的时候,采用的是立即加载的方式,也就是说一加载完配置文件就立刻创建Bean对象,这种方式适合于使用单例对象的情况
  • BF在构建核心容器的时候,采用的是延迟加载的方式,也就是加载配置文件的时候不会创建对象,但是在调用getBean函数,通过id获取Bean对象的时候,才会去创建对象。这种方式适合于使用多例对象的情况。

Spring会根据我们配置的不同改变创建对象的方式,也就是它能够根据我们所要对象的单例还是多例,更换不同的加载策略。下节会整理创建Bean对象的三种方式。