hlantian的博客园

导航

 

 容器是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的实现:
AbstractResource, ByteArrayResource, ClassPathResource,DescriptiveResource,FileSystemResource,InputStreamResource,PortletContextResource,ServletContextResource,UrlResource


代码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,确保当你需要的时候他们已经准备好了,你的应用不需要等待他们被创建。

posted on 2012-02-16 13:27  hlantian的博客园  阅读(106)  评论(0编辑  收藏  举报