如果说BeanFactory是spring的心脏,那么ApplicationContext就是spring的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的的功能。还记得上节课我们提到XmlBeanFactory过期的api吗?他的代替方法就是ApplicationContext。
1、ApplicationContext是什么?
ApplicationContext,即应用上下文。ApplicationContext是spring的一个接口,它主要有两个实现类,ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。
下面我们来看一下ApplicationContext的结构体系:
可以看得出来,ApplicationContext接口的最终父接口是BeanFactory,而最终的实现类,正是我们刚才所说的ClassPathXmlApplicationContext和FileSystemXmlApplicationContext两个类。
2、两个最终实现类有什么区别?
ClassPathXmlApplicationContext默认从类路径加载配置文件,而FileSystemXMLApplicationContext默认从文件系统中加载配置文件,其他方面没有很大区别。
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringTest{
public static void main(String[] args) {
// ApplicationContext content = new FileSystemXmlApplicationContext("//Users/beijingduanluo/Documents/applicationContext.xml");
ApplicationContext content = new ClassPathXmlApplicationContext("applicationContext.xml");
People peo = (People) content.getBean("peo");
System.out.println(peo);
}
}
值得注意的是,FileSystemXmlApplicationContext的构造传参如果是字符串并且第一个字符是“/”的话,spring会自动去掉这个“/”,所以必要的时候,需要多谢个“/”,就像上面的例子。
3、应用上下文相对于BeanFactory来说,有哪些扩展?
我们分析一下ApplicationContext相对于BeanFactory多实现的这些接口:
- ApplicationEventPublisher:使容器拥有了事件的功能,包括容器启动事件、关闭事件等。
- MessageSource:为应用提供i18n国际化消息访问的功能。
- ResourcePatternResolver:这个接口让容器可以通过带前缀的ant风格的资源文件路径装载spring的配置文件,其实就是放弃了spring的Resource类,并直接在ApplicationContext构造函数传参带通配符的路径字符串。
- LifeCycle:该接口提供了start()和stop()两个方法,主要用于控制异步处理。
这些接口,是BeanFactory没有,而ApplicationContext特有的,也就意味着ApplicationContext要比BeanFactory多出这些功能。所以我们经常这么来描述BeanFactory和ApplicationContext的关系:BeanFactory面向的是程序底层,ApplicationContext面向的应用功能。