Spring 中 ApplicationContext 、WebApplicationContext 和 BeanFactory 比较
SpringBeanWeb 框架配置管理
BeanFactory 是 Bean 的工厂接口,用于生成管理不同类型的 java Bean 对象。
ApplicationContext 是建立在BeanFactory基础之上,提供了更多面向应用的功能。
根据两者的用途,我们可以进行简单的划分:
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;
ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合我们都直接使用 ApplicationContext 而非底层的 BeanFactory。
以下是两种创建 Bean 的不同方法:
Java代码
- //用BeanFactory创建Bean实例
public static void main(String args[]){ Resource res=new ClassPathResource("com/beanfactory/beans.xml"); BeanFactory bf=new XmlBeanFactory(res); Car car=(Car)bf.getBean("car");//得到一个Car Bean实例 }
- //用ApplicationContext创建Bean实例
public static void main(String args[]){ ApplicationContext application = new ClassPathXmlApplicationContext(beans.xml")); Car car=(Car)application.getBean("car"); }
BeanFactory被初始化的时候,并没有加载所有的单实例Bean对象,而是等到调用getBean()方法的时候才初始化相应的Bean实例对象。
ApplicationContext被初始化的时候就已经检查所有的Bean对象并初始化,当调用getBean()方法的时候,直接可以从缓存中取出相应的Bean实例对象。
ApplicationContext这种加载方式特点:
在刚开始加载ApplicationContext对象的时候,会出现一点延迟,但以后加载每一个Bean对象的时候会很快。而且在刚开始的时候就对Bean对象进行配置校验,以防止加载出错。
WebApplicationContext是实现ApplicationContext接口的子类。是专门为WEB应用准备的,它允许从相对于Web根目录的路径中加载配置文件完成初始化工作。从WebApplicationContext中可以获取ServletContext引用,整个Web应用上下文对象将作为属性放置在ServletContext中,以便Web应用环境可以访问Spring上下文。同时WebApplicationContext还为Bean提供了三个新的作用域,request、session和globalsession。而在非web环境下,Bean只有singleton和prototype两种作用域。
WebApplicationContext的初始化是通过WebApplicationContextUtils类中的getApplicationContext(ServletContext sc)方法实现的。