Spring 中 ApplicationContext 、WebApplicationContext跟 BeanFactory比较
Spring 中 ApplicationContext 、WebApplicationContext和 BeanFactory比较BeanFactory是Bean的工厂接口,用
Spring 中 ApplicationContext 、WebApplicationContext和 BeanFactory比较
BeanFactory是Bean的工厂接口,用于生成管理不同类型的java Bean对象,ApplicationContext是建立在BeanFactory基础之上,提供了更多面向应用的功能。
根据两者的用途,我们可以进行简单的划分:
BeanFactory是Spring框架的基础设施,面向Spring本身;
ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合我们都直接使用ApplicationContext而非底层的BeanFactory。
以下是两种创建Bean的不同方法:
//用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");}
两者在加载Bean实例时的区别:
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)方法实现的。