ApplicationContext比BeanFactory提供了更多的功能,因此一般情况下都会使用ApplicationContext,只有在资源有限的情况下(例如在移动设备上)才使用BeanFactory。
在ApplicationContext的多个实现中,最常用的有3个:
ClassPathXmlApplicationContext:在所有的classpath中查找指定的xml文件。
FileSystemXmlApplicationContext:在文件系统中查找指定的xml文件。(可以指定相对路径,当前路径为当前目录)。
XmlWebApplicationContext:从一个web应用程序中包含的xml文件中读取context定义。
ApplicationContext是扩展的BeanFactory接口
public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver{
…………
}
从ApplicationContext获取对象也是使用getBean方法。
ApplicationContext和BeanFactory有一个很大的不同是:BeanFactory是在需要bean的时候才会实例化bean;ApplicationContext会在装入context的时候预先装入所有的singleton的bean。(singleton是在bean的定义中<bean>元素的一个属性,缺省值为true)。
例如,针对上一节的例子,我们将ExecutableApp类更改为:
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class ExecutableApp {
public ExecutableApp () {
}
public static void main(String args[]){
System.out.println(“Before load xml file”);
ApplicationContext factory= new FileSystemXmlApplicationContext("configuration.xml");
System.out.println(“After load xml file”);
Greeting personA = (Greeting)factory.getBean("greetingService");
personA.sayHello();
}
}
运行的结果是:
Before load xml file
Instance GreetingImpl object
Instance MrSmith object
After load xml file
Hi,Mr Smith
也就是说,ApplicationContext在装载xml文件的同时就实例化了GreetingImpl类和MrSmith类。
如果我们将xml文件的更改为:
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTDBEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="person" class="MrSmith" singleton="false"/>
<bean id="greetingService"
class="GreetingImpl" singleton="false">
<property name="greeting">
<value>Hello</value>
</property>
<property name="who”>
<ref bean="person"/>
</property>
</bean>
</beans>
那么ExecutableApp的运行结果是:
Before load xml file
After load xml file
Instance GreetingImpl object
Instance MrSmith object
Hi,Mr Smith
也就是说,在装载xml文件时,ApplicationContext并没有实例化GreetingImpl类和MrSmith类,直到需要这两个类的时候才会实例化它们。