「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战
不知道你在面试过程中有没有被问到过这道问题,本质上来说并没有多么难,但是它主要是理论知识的介绍,因此包含的文字描述会非常多。
相同点
Spring 提供了两种不同的 IoC 容器,一个是 BeanFactory,另外一个是 ApplicationContext。BeanFactory 就是对象的一个工厂,而 ApplicationContext 是应用程序上下文,它就是直接翻译。但是需要注意一点,什么事儿他们都是 Java 接口,ApplicationContext 就是 BeanFactory 的一个子接口,它需要继承或实现自 BeanFactory。
它们都可以用 XML 文件的方式来进行相关的配置,也支持属性的自动注入。
ListableBeanFactory 继承 BeanFactory,BeanFactory 和 ApplicationContex 都提供了一种方式,使用 getBean 的方式来获取 bean 对象,也就是在进行使用的时候,使用方式是相同的。
不同点
当调用 getBean 方法方法的时候,BeanFactory 紧实力化对象,而 ApplicationContext 在启动容器的时候会实力化单例 bean,不会等待调用 getBean 的时候才进行实例化。也就是两个方式在进行对象创建的时候,创建的时机是不同的,一定要把这点搞明白。你如果谁看过 Spring 源码应该比较清楚,每次当动好容器之后,会把容器里面预先准备好的这些单例对象提前进行实例化。而如果你配置的是 prototype类型,在什么时候用的时候才会对它进行实地化。
BeanFactory 不支持国际化,即 i18n 的操作,而 ApplicationContext 提供了对他的支持。果你的网站只是在国内进行使用没有任何问题。但如果你的网站需要在国际上进行访问,它一定要进行语言的切换,这个时候就需要用到我们的国际化配置了。
BeanFactory 和 ApplicationContext 之间另一个区别是能够将事件发布注册到容器中的 Bean。有一个支持了监听器,另外一个并不支持监听器。
BeanFactory 的一个核心实现是 XMLBeanFactory,而 ApplicationContext 核心实现 ClassPathXMLApplication。Web 容器的环境,我们使用的是 WebApplicationContext,并且增加了 getServletContext 方法。 比如在使用的时候,特别是在 Spring MVC使用的时候,你获取到的容器都 WebApplicationContext,而不是 WebBeanFActory。把这两点要区分清楚了,因为你在学完 Spring 框架之后,基本上都会接触 Spring MVC。虽然现在在生产环境里面用的比较少了,但依然有些公司的传统项目里面还在用 Spring MVC,所以你要对这个机制有所了解。
如果使用自动注入并使用并 BeanFactory,则需要使用 API 注册 AutowiredBeanPostProcessor。而如果使用 ApplicationContext,则可以直接通过 XML 进行配置。这个只要是你的使用方式,也就是你在写代码的时候或者写项目的时候,你用的到底是 XML 文件的配置方式呢,还是用注解的方式,这跟你公司的规定相关了。现在主流的开发一般都是注解的方式。
简而言之,BeanFactory 提供了基本的 IOC 和 DI 的功能。而 ApplicationContext 提供了更高级别的功能,BeanFactory 可用于测试和非生产使用,而 ApplicationContext 是功能更丰富的容器实现,应该优于 BeanFActory。也就是 BeanFactory 是一个父接口。但是我们在日常工作或使用中,推荐使用的是ApplicationContext,因为里面做了很多接口的扩展,包括做了很多丰富的实践,让我们用起来更加舒服和更加方便。