容器是Spring 的核心,基于Spring 的应用中可以使用Spring容器来创建、装配和激活组件(bean)
Spring提供了多种容器实现,并分为两类。①Bean工厂(org.springframework.beans.factory.BeanFactory 接口定义)是最简单的容器,提供了基础的依赖注入支持。② 应用上下文(org.springframework.context.ApplicationContext 接口定义)建立在Bean工厂基础之上,提供了系统构架服务,如:从属性文件中读取文本信息,向有关事件监听器发布时间
1 Bean工厂采用了工厂设计模式。这个类负责创建和分发Bean。
在Spring中有几种BeanFactory实现。其中最常用的是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中的定装载Bean。
要创建XmlBeanFactory需要传递一个org.springframework.core.io.Resource实例给构造函数。此Resource对象提供xml文件给工厂。
Resource的实现:
代码1:利用FileSystemResource来创建一个XmlBeanFactory,其Bean的定义来自文件系统中的xml文件
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("D:/beans.xml"));
这行代码告诉Bean工厂从XML文件中读取到Bean的定义信息。但是,现在Bean工厂还没有实例化Bean。Bean是被延迟载入到Bean工厂中。就是说Bean工厂会立即把Bean的定义信息载入进来,但是Bean只有在呗需要的时候才被实例化。
为了从Beanfactory得到一个Ban,只要简单的调用getBean()方法,把你需要的Bean名字当做参数传递进去就行。
MyBean myBean = (MyBean) factory.getBean("myBean");
当getBean()方法被调用时候,工厂会实例化Bean并且使用依赖注入设置Bean的属性。这样就在Spring容器中开始Bean的生命。
2 使用上下文ApplicationContext
ApplicationContext和BeanFactory差不大uo,两者都是载入Bean定义信息,装配Bean,根据需要分发Bean。但是ApplicationContext提供了更多功能:
- 提供了文本信息解析工具,包括对国际化(118N)的支持。
- 提供了载入文件资源的通用方法,如载入图片。
- 可以像注册为监听器的Bean发送时间
由于它提供了附加功能,几乎所有的应用系统都选择ApplicationContext而不是BeanFactory。只有在资源很少的情况下,才回考虑使用BeanFactory,如在移动设备上。
在ApplicationContext的诸多实现中,有三个实现经常用到:
- ClassPathXmlApplicationContext---从类路径中的xml文件载入上下文定义信息,上下文定义文件当成类路径资源。
- FileSystemXmlApplicationContext---从文件系统中的xml文件载入上下文定义信息。
-
XmlWebApplictionContext---从web系统的xml文件载入上下文信息。
代码例子
ApplicationContext context = new FileSystemXmlApplicationContext("D:/beans.xml");
ClassPathXmlApplicationContext context2 = new ClassPathXmlApplicationContext("beans.xml");
FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext的区别:FileSystemXmlApplicationContext只能在制定的路径中寻找beans.xml文件,而ClassPathXmlApplicationContext 可以在整个类路径(包括jar文件)中寻找beans.xml。
除了ApplicationContext提供的附加功能外,因为ApplicationContext与BeanFactory的另一个重要区别是关于单例Bean是如何被装在的。Bean工厂延迟载入所有Bean,知道getBean()方法被调用时Bean才被创建。应用上下文则聪明点,它会在上下文启动后预载入所有单例Bean。通过预载入单例Bean,确保当你需要的时候他们已经准备好了,你的应用不需要等待他们被创建。