扫码关注微信公众号

回复“面试手册”,获取本站PDF版

回复“简历”,获取高质量简历模板

回复“加群”,加入程序员交流群

回复“电子书”,获取程序员类电子书

当前位置: Java > Spring高频面试题 > 9.BeanFactory 和 ApplicationContext有什么区别?

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。至于它们之间的关系,可以打开idea,查看它们的UML类图,如下,从可以看出ApplicationContext是BeanFactory的子接口

BeanFactory
BeanFactory

两者之间的区别

作用

BeanFactory接口作用:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。

ApplicationContext接口作用:ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还有额外的功能

  • 提供在监听器中注册bean的事件
  • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
  • 同时加载多个配置文件
  • 统一的资源文件访问方式
  • 继承MessageSource,因此支持国际化

加载方式

BeanFactroy:采用的是延迟加载形式来注入Bean,也就是只有在使用到某个bean时,才会对该bean进行加载实例化,这样的弊端很明显,就是如果spring的配置存在问题,那么只有BeanFactory加载后,使用到这个bean时才可以发现问题。

ApplicationContext:ApplicationContext采用的是预加载机制,在容器启动时,一次性创建所有的bean。这种可以避免BeanFactory接口中出现的问题,容器启动时就可以发现Spring配置中存在的错误,但缺点是会占用内存空间,并且当配置的bean较多时,程序启动会变慢。

创建方式

BeanFactroy:采用编程的方式创建,如BeanFactory factory = new XmlBeanFactory (new ClassPathResource("beans.xml"));

ApplicationContext:除了采用编程的方式创建,还可以使用声明的方式创建,在web.xml文件添加如下代码

<!--指定Spring配置文件的位置,有多个配置文件时,以逗号分隔-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <!--spring将加载spring目录下的applicationContext.xml文件-->
    <param-value>
        classpath:spring/applicationContext.xml
    </param-value>
</context-param>
<!--指定以ContextLoaderListener方式启动Spring容器-->
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

注册方式

BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。


点击面试手册,获取本站面试手册PDF完整版