1. Spring是管理bean的容器 . Spring提供了多种容器实现,并分为两类 . Bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供了基础的依赖注入支持. 应用上下文(由org.springframework.context.ApplicationContext接口定义)建立在Bean工厂基础之上,提供了系统架构服务.
2. BeanFactory:Bean工厂采用了工厂设计模式. 就是说,这个类负责创建和分发Bean. 但是,不像其他工厂模式的实现,它们只是分发一种类型的对象,而Bean工厂是一个通用的工厂,可以创建和分发各种类型的Bean.
但是,除了简单的实例化和分化应用对象以外,Bean工厂还有很多工作要做.由于Bean工厂知道应用系统中的很多对象,所以它可以在实例化这些对象的时候,创建协作对象间的关联关系. 这样就把配置的负担从Bean自身以及Bean的调用者中脱离出来.结果,Bean工厂分发出来的Bean都已经被配置好了,都得到了它们的关联对象,已经可以被使用了.Bean工厂要参与到Bean的生命周期中,调用用户定义的初始化和销毁方法(如果定义了这些方法的话).
在Spring中有几种BeanFactory的实现.其中最常使用的org.springframework.beans.factory.xml.XmlBeanFactory,它根据XMl文件中的定义装配Bean.
要创建XmlBeanFactory,需要传递一个org.springframework.core.io.Resource实例给构造函数.此Resource对象提供XML文件给工厂.
针对不同的资源,资源位置 Resource有多重实现类.
例如:下面的代码片段使用了一个FileSystemResource来创建一个XmlBeanFactory,其Bean的定义来自文件系统中的XML文件:
BeanFactory factory=new XmlBeanFactory(new FileSystemResource("c:/beans.xml"));
这行简单的代码告诉Bean工厂从XML文件中读取Bean的定义信息. 但是,现在Bean工厂还没有实例化Bean . Bean是被延迟载入到Bean工厂中的,就是说Bean工厂会立即把Bean定义信息载入进来,但是Bean只有在被需要的时候才被实例化.
为了从BeanFactory得到一个Bean,只要简单的调用getBean()方法,把你需要的Bean的名字当做参数传递进去就行了.\
MyBean myBean=(MyBean)factory.getBean("myBean");
当getBean()方法被调用的时候,工厂就会实例化Bean并且使用依赖注入设置Bean的属性.这样在Spring的容器当中就开始了Bean的生命周期.
3. ApplicationContext:表面上ApplicationContext和BeanFactory差不多.两者都是载入Bean定义信息,装配Bean,根据需要分发Bean.但是ApplicationContext提供了更多功能:
`应用上下文提供了文本信息解析工具,包括对国际化(I18N)的支持
`应用上下文提供了载入文件资源的通用方法,入载入图片
`应用上下文可以向注册为监听器的Bean发送事件
由于它提供的附加功能,几乎所有的应用系统都选择ApplicationContext而不是BeanFactory.只有在资源很好的情况下,才会考虑采用BeanFactory,如在移动设备上.
在ApplicationContext的诸多实现中,有三个实现经常用到:
`ClassPathXmlApplicationContext-从类路径中的XMl文件载入上下文定义信息,把上下文定义文件当成类路径资源
`FileSystemXmlApplicationContext-从文件系统中的XML文件载入到上下文定义信息
`XmlWebApplicationContext-从Web系统中的Xml载入上下文定义信息
例如:下面的代码显示了如何载入FileSystemXmlApplicationContext:
ApplicationContext context=new FileSystemXmlApplicationContext("c:/foo.xml");