likes
comments
collection
share

今天一定要搞清楚BeanFactory和ApplicationContext的关系

作者站长头像
站长
· 阅读数 18

先概括的说一下

在Spring框架中,BeanFactory和ApplicationContext是两个重要的接口。BeanFactory是Spring框架中的基础设施,用于创建和管理Bean对象。ApplicationContext接口继承了BeanFactory接口,并且扩展了许多新的功能。在实际应用中,ApplicationContext比BeanFactory更加常用,因为它提供了更多的特性,如国际化消息,事件发布等。ApplicationContext是BeanFactory的超集,也就是说,ApplicationContext拥有BeanFactory的所有功能,同时还提供了更多的功能。 ApplicationContext在启动时会自动加载BeanFactory,并且在此基础上进行扩展。总的来说,BeanFactory是Spring框架的基础设施,ApplicationContext是在BeanFactory基础上进行扩展的。对于大多数的应用场景,使用ApplicationContext比BeanFactory更加方便和实用。

看到这里大家应该明白了他俩的关系。其实面试的时候这样说也就差不多了。但是为了加深理解,我还是得掰扯掰扯。

BeanFactory主要的实现功能还是Bean实例的管理,就好比一个map容器,主要是put和get,但是在Spring框架中如果只有这么简单的功能那么很多事情也是处理不了,所以就产生了ApplicationContext来实现更多的功能。所以大家常常认为BeanFactory是低级容器,ApplicationContext是高级容器。ApplicationContext继承了更多的接口。

ApplicationContext继承了以下接口:

  • BeanFactory:创建和管理Bean对象
  • ResourceLoader:用于加载资源,例如文件、URL、类路径等
  • ApplicationEventPublisher:用于发布和监听应用程序事件
  • MessageSource:用于支持国际化消息
  • EnvironmentCapable:用于获取运行环境的相关信息
  • ResourcePatternResolver:扩展ResourceLoader,用于根据通配符匹配资源

这样ApplicationContext对BeanFactory多了工具级别的支持,所以他的名字改成了应用上下文,代表着大容器的所有功能。

今天一定要搞清楚BeanFactory和ApplicationContext的关系

其中在ApplicationContext里面定义了一个refresh方法。主要用来刷新整个容器,即重新加载/刷新所有的bean。

那么下面用一张图来看下BeanFactory和ApplicationContext的关系

今天一定要搞清楚BeanFactory和ApplicationContext的关系

ApplicationContext抽象实现类AbstractApplicationContext依ConfigurableListableBeanFactory 的getBeanFactory()方法获取beanFactory,通过BeanFactory的getbean方法获取bean。ApplicationContext更多的功能是可以访问文件资源,支持事件。bean的实例化和使用上核心都在BeanFactory实现类中。

BeanFactory 主要负责加载Bean,获取bean。ApplicationContext还可以刷新BeanFactory的配置、生命周期、事件回调等。

总结:

IoC 在 Spring 里,BeanFactory主要做2 件事:

  1. 加载配置文件,解析成 BeanDefinition 放在 Map 里。
  2. 调用 getBean 的时候,从 BeanDefinition 所属的 Map 里,拿出 Class 对象进行实例化,同时, 如果有依赖关系,将递归调用 getBean 方法完成依赖注入。

ApplicationContext除了以上功能,当他执行 refresh 模板方法的时候,将刷新整个容器的 Bean。同时不仅仅是 IoC,他支持不同信息源头,支持 BeanFactory 工具类,支持层级容器,支持访问文件资源,支持事件发布通知,支持接口回调等等。