Spring 4.x IOC介绍(四.BeanFactory 、ApplicationContext、WebApplicationContext——总结)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/java_yes/article/details/82107557

前面对BeanFactory 、ApplicationContext、WebApplicationContext分别进行了分析,下面进行一下总结。

BeanFactory

继承体系:

BeanFactory作为一级接口,其子接口有HierarchicalBeanFactory、ConfigurableBeanFactory等。其ConfigurableBeanFactory接口作为一个重要的子接口,增强了IoC容器的可定制型。它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法。

作用:

提供了高级IoC的配置机制。BeanFactory使管理不同类型的Java对象成为可能。可以创建并管理各种类的对象。

初始化:

使用Spring配置文件为类提供配置信息,然后通过BeanFactory装在配置文件,启动SpringIoC容器。

ApplicationContext

继承体系:

ApplicationContext作为三级接口,其父类接口为:HierarchiacalBeanFactory和ListableBeanFactory,其中HierarchiacalBeanFactory继承了BeanFactory,所以ApplicationContext在BeanFactory基础上拓展了许多功能。其主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext

作用:

ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能,在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置的方式实现。
相比于BeanFactory来说,ApplicationContext拓展了很多功能,比如:

  1. MessageSource, 提供国际化的消息访问
  2. 资源访问(如URL和文件)
  3. 事件传递
  4. Bean的自动装配
  5. 各种不同应用层的Context实现

初始化:

和BeanFactory初始化类似,ApplicationContext的初始化也很简单。如果配置文件放置在类路径下,则可以优先考略使用ClassPathXmlApplicationContext实现类。

如果配置文件放置在文件系统的路径下,则可以优先考虑使用FilySystemXmlApplicationContext实现类。

当然,FileSystemXmlApplicationContext和ClassPathXMLApplication都可以显式使用带资源类型前缀的路径,他们的区别在于如果不显式指定资源类型前缀,则分别将路径解析为文件系统路径和类路径。

这里和BeanFactory不同的是:BeanFactory在初始化容器时,并未实例化Bean,知道第一次访问某个Bean时菜实例化目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactory稍长一些,不过稍后的调用则没有“第一次惩罚”的问题。

WebApplicationContext

继承体系:

WebApplicationContext继承自ApplicationContext。

作用:

WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作。从WebApplicationContext中可以获得ServletContext的引用,整个Web应用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring应用上下文。

初始化:

WebApplicationContext的初始化方式和BeanFactory、ApplicationContext有所区别,因为WebApplicationContext需要ServletContext实例,也就是说,它必须在拥有Web容器的前提下才能完成启动工作。可以在web.xml中配置自启动的servlet或定义web容器监听器(ServletContextListener),借助二者中的任何一个,就可以完成启动Spring Web应用上下文的工作。

猜你喜欢

转载自blog.csdn.net/java_yes/article/details/82107557