Spring的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之间的关系了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值