Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。它们代表了Spring容器。
BeanFactory
BeanFactory接口负责创建和分发各种类型的Bean。
在Spring中有几种BeanFactory的实现,其中最常用的是org.springframework.bean.factory.xml.XmlBeanFactory。它根据XML文件中的定义装载Bean。
要创建XmlBeanFactory,需要传递一个InputStream对象给构造函数,用来提供XML文件给工厂。
例如:
BeanFactory factory=new XmlBeanFactory(new FileInputStream("applicationContext.xml"));
这行代码告诉BeanFactory从XML文件中读取Bean的定义信息,但是没有实例化Bean。
当getBean()方法被调用的时候,把需要的Bean的名字当作参数传递进去,工厂就会实例化Bean,并使用依赖注入开始设置Bean的属性。
例如:
MyBean myBean=(MyBean)factory.getBean("myBean");
ApplicationContext
ApplicationContext(应用上下文)继承自BeanFactory,表面上看两者功能差不多,都是载入Bean定义信息,装配Bean,根据需要分发Bean,但是ApplicationContext提供了更多功能:
1、应用上下文提供了文本信息解析工具,包括对国际化的支持
2、应用上下文提供了载入文本资源的通用方法,如载入图片
3、应用上下文可以向注册为监听器的Bean发送事件
在ApplicationContext的诸多实现中,有如下三个常用的实现。
ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当成类路径资源。
FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息
XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息
例如:
ApplicationContext applicationContext=new FileSystemXmlApplicationContext("src/applicationContext.xml");
ApplicationContext applicationContext2=new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext applicationContext3=WebApplicationContextUtils.getWebApplicationContext(Request.getSession().getServletContext());
FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的区别是:FileSystemXmlApplicationContext只能在指定的路径中寻找,而ClassPathXmlApplicationContext可以在整个类路径中寻找。
除了ApplicationContext提供的附加功能外,ApplicationContext和BeanFactory另一个重要区别是单实例Bean如何被加载。
ApplicationContext会在上下文启动后预载入所有的单实例Bean,确保当需要的时候它们已经准备好,应用程序不需要等待它们被创建。