BeanFactory和ApplicationContext
BeanFactory接口是Spring 实现IOC容器的基础。在Spring中有很多的BeanFactory,也有很多Context。这两者之间有什么联系呢?
BeanFactory
我们以XmlBeanFactory为例子,引入BeanFactory家族的直观图
第一梯队
在BeanFactory家族中,接口BeanFactory是做为root 接口存在的。我们看下BeanFactory接口:
BeanFactory接口,定义了很多的get方法和is判断方法,定义了管理bean的最基本的方法,例如获取实例、基本的判断等。
第二梯队
主要是有 ListableBeanFactory , HierarchicalBeanFactory
ListableBeanFactory
ListableBeanFactory在原有BeanFactory的基础上,提供了更加丰富的获取Bean信息的方法,不仅仅是可以获取Bean本身的信息,还可以获取BeanDefinition信息。
HierarchicalBeanFactory
HierarchicalBeanFactory相对提供的功能就比较简单了,可以提供父容器的查询
第三梯队
ConfigurableBeanFactory
ConfigurableBeanFactory主要是对父接口HierarchicalBeanFactory进行增强,在接口的注释文档中有指明,ConfigurableBeanFactory定义了绝大多数BeanFactory需要实现的功能,如添加Bean的后置处理器,注册属性编辑器等
第四梯队
AutowireCapableBeanFactory
现在大部分的注入,基本都是基于注解了,主要就是基于AutowireCapableBeanFactory接口,里面定义了很多注解相关的处理方法,还定义了注入的方式:0就是不自动注入,1就是通过beanName进行注入,2就是通过type进行注入
AbstractBeanFactory
既然ConfigurableBeanFactory定义绝大多数BeanFactory都需要实现的功能,是不是所有的Factory都需要将所有的方法是实现一遍呢?当然不是,ConfigurableBeanFactory本身是一个抽象方法,将大多数Factory可以公共实现的逻辑进行整合,注释中也有说明,ConfigurableBeanFactory是BeanFactory的基础实现。
第五梯队
ConfigurableListableBeanFactory
对大多数ListableBeanFactory进行增强
AbstractAutowireCapableBeanFactory
这是一个抽象类,实现了默认BeanFactory的功能,它本身是实现了AutowireCapableBeanFactory接口,所以默认的BeanFactory即可支持注解方式实现。
第六梯队
DefaultListableBeanFactory
BeanFactory家族的集大成者,不仅仅实现了BeanFactory的功能,还顺带实现了BeanDefinitionResgistry接口,实现对BeanDefinition的增强。
ApplicationContext
以SpringBoot中默认的AnnotationConfigServletWebServerApplicationContext为例引出直观关系图:
第一梯队
BeanFactory
从关系图中,我们可以看出,BeanFactory是ApplicationContext的父接口,所以严格来讲,所有的Context实现,也都是归属于Factory家族。
另外通过类图可以发现,ApplicationContext还继承了诸如Environment、Resource、Message、Event
等相关的接口,也就是说除了bean的管理配置相关的能力,ApplicationContext还拥有了Environment(环境)、MessageSource(国际化)、ResourceLoader(资源)、ApplicationEventPublisher(应用事件)等服务相关的接口,简单的说ApplicationContext是以bean管理为基础的综合能力扩展,用于满足业务对Spring综合能力的需要。
第二梯队
ApplicationContext
ApplicationContext在BeanFactory接口的基础上,本身也提供了部分功能的扩展
第三梯队
ConfigurableApplicationContext
ReactiveWebApplicationContext
WebServerApplicationContext
WebApplicationContext
可以看到,已经在按照各自的使用场景进行细分了
后面的子接口就不写了。
总结
BeanFactory采用懒加载模式,在需要这个Bean的时候才会去getBean,ApplicationContext会在启动时就加载所有Bean,容量方面ApplicationContext会占用比较多,启动过程会慢一点。
beanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 Applicationcontex 主要面对与 spring 使用的开发者。基本都会使用 Applicationcontex 并非 beanFactory 。
现在我们再回过头来看下SpringBoot的启动,起ApplicationContext和BeanFactory的关系:
现在我们可以梳理出,SpringBoot中默认的ApplicationContext和BeanFactory之间的关系了。