面试题|Spring中BeanFactory与ApplicationContext的本质区别和作用

  BeanFactory 是Bean工厂,是Spring 框架最核心的接口,它提供了高级IoC 的配置机制。如果说BeanFactory是Spring的心脏,那么应用上下文ApplicationContext就是完整的躯体了,ApplicationContext继承了BeanFactory接口,拥有BeanFactory的全部功能,扩展了更多面向实际应用的、企业级的高级特性。

  它们都可以视作Spring的容器,Spring容器负责对象(Spring中我们都称之为bean)整个生命周期的管理——实例化、装配和销毁 Bean。在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源,Hibernate的SessionFactory、事务管理器等。我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文。

本质区别:BeanFactory是懒加载,ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean,可以指定为延迟加载。

  BeanFactory在初始化容器时,并未实例化Bean,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至首次调用getBean方法才会抛出异常;而ApplicationContext则在初始化应用上下文时初始化所有单实例的Bean,这样有利于检查所依赖属性是否已经注入。综上所述,通常情况下我们首选ApplicationContext。

  由于ApplicationContext会预先初始化所有的Singleton Bean,于是在系统创建前期会有较大的系统开销,但一旦ApplicationContext初始化完成,程序后面获取Singleton Bean实例时候将有较好的性能。

二者作用描述如下:

  1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。
  2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
    a. 国际化支持
    b. 资源访问:Resource rs = ctx. getResource(”classpath:config.properties”), “file:c:/config.properties”
    c. 事件传递:通过实现ApplicationContextAware接口
  3. 常用的获取ApplicationContext的方法:
    FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组
    ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件
    WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

  这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>

Reference

posted @ 2022-02-09 17:15  楼兰胡杨  阅读(1894)  评论(1编辑  收藏  举报