zoukankan      html  css  js  c++  java
  • 【Spring】3、BeanFactory 和 ApplicationContext的区别

    转自:http://blog.csdn.net/intlgj/article/details/5660587

    spring中,两个最基本最重要的包是 org.springframework.beans 和 org.springframework.context. 这两个包中的代码为Spring的反向控制 特性(也叫作依赖注射)提供了基础。

    第一, BeanFactory

    BeanFactory实际上是实例化,配置和管理众多bean的容器。 这些bean通常会彼此合作,因而它们之间会产生依赖。 BeanFactory使用的配置数据可以反映这些依赖关系中 (一些依赖可能不像配置数据一样可见,而是在运行期作为bean之间程序交互的函数)。

    一个BeanFactory可以用接口org.springframework.beans.factory.BeanFactory表示, 这个接口有多个实现。 最常使用的的简单的eanFactory实现是org.springframework.beans.factory.xml.XmlBeanFactory。 (这里提醒一下:ApplicationContext是BeanFactory的子类, 所以大多数的用户更喜欢使用ApplicationContext的XML形式)。

          要创建XmlBeanFactory,需要传递一个org.springframework.core.io.Resource实例个构造函数。此Resource对象提供XML文件给工厂。

    Spring提供了有用的Resource实现。

    org.springframework.core.io.ByteArrayResource定义内容有一组字节给定的资源

    org.springframework.core.io.ClassPathResource定义可以从classpath提取的资源

    org.springframework.core.io.DescriptiveResource定义包含资源描述符但是实际没有可以读取的资源

    org.springframework.core.io.FileSystemRescource定义可以从文件系统提取的资源

    org.springframework.core.io.InputStreamResource定义可以从输入流提取的资源

    org.springframework.web.portlet.context.PortletContextResource定义可用在portlet上下文的资源

    org.springframework.web.portlet.context.suport.servletContextRescource定义可用在Servlet上下文中的资源

    org.springframework.core.io.UrlRescource定义可从给定的URl提取的资源

    ApplicationContext 和Resource 路径

    1.ClassPathResource:

    只有一种方式new ClassPathResource("applicationContext.xml");

    取得Resource接口的实例 后,可以使用getFile(),getInputStream()等方法来操作资源文件Resource 接口的事例只是资源文件一个抽象代表,指定的资源有可能不存在,可以使用exists()进行测试

    以文件系统绝对路径和相对路径的两种方式进行访问;

    如:

    (1)绝对路径:Resource resource = context.getResource("E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml")。

    (2)相对路径:但是如果使用相对路径要注意其根目录。例如在eclipse中,它的根目录就是你工程目录作为你的根目录。Resource resource = context.getResource("src/applicationContext.xml")。              

                       

    2.FileSystemResource:有两种方式;

    3.ServletContextResource:通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。如:Resource resource = context.getResource("src/applicationContext.xml")。 

    4.UrlResource :通过Java.NET.URL来访问资源,当然它也支持File格式:"file:"

    第二,ApplicationContext

     beans包提供了以编程的方式管理和操控bean的基本功能,而context包增加了ApplicationContext,它以一种更加面向框架的方式增强了BeanFactory的功能。多数用户可以以一种完全的声明式方式来使用ApplicationContext,甚至不用去手工创建它,但是却去依赖像ContextLoader的支持类,在J2EE的Web应用的启动进程中用它启动ApplicationContext。当然,这种情况下还可以以编程的方式创建一个ApplicationContext。

    Context包的基础是位于org.springframework.context包中的ApplicationContext接口。它是由BeanFactory接口集成而来,提供BeanFactory所有的功能。为了以一种更像面向框架的方式工作,context包使用分层和有继承关系的上下文类,包括:

    1.MessageSource,提供对i18n消息的访问;

    2.资源访问,比如URL和文件;

    3.事件传递给实现了ApplicationListener接口的bean;

    4.载入多个(有继承关系)上下文类,使得每一个上下文类都专注于一个特定的层次,比如应用的Web层

    在ApplicationContext的诸多实现中,有三个经常用到:

    1。ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当作类路径资源。

    2。FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息。

    3。XmlWebApplicationContext:从Web系统中的XMl文件载入上下文信息。

    例如:

    //通过ApplicationContext来获取Spring的配置文件
      ApplicationContext actx=new FileSystemXmlApplicationContext("applicationContext.xml.xml");
      //通过Bean的id来获取bean
      Hello hello=(Hello)actx.getBean("HelloWorld");

    无论是那种实现,都是用getBean()方法,这不要奇怪,因为ApplicationContext接口扩展自BeanFactory接口。

    应用上下文与Bean工厂的另一个重要的区别就是关于单实例Bean是如何载入的。Bean工厂延迟载入所有的Bean,直到getbean()方法被调用是Bean才被创建。应用上下文则会在上下文启动后预载入所有的单实例Bean。通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。

    下面我总结下载入配置文件的方法:

     ApplicationContext

    1. ClassPathXmlApplicationContext  编译路径总有三种方式:
       1) ApplicationContext factory=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        2)ApplicationContext factory=new ClassPathXmlApplicationContext("applicationContext.xml");  
     3)ApplicationContext factory=new ClassPathXmlApplicationContext("file:E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");
    2.  FileSystemXmlApplicationContext用文件系统的路径总有两种相对与绝对路径
        1) ApplicationContext factory=new FileSystemXmlApplicationContext("src/applicationContext.xml");
          2) ApplicationContext factory=new FileSystemXmlApplicationContext("E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");
        3. XmlWebApplicationContext   是专为Web工程定制的。
        ServletContext servletContext = request.getSession().getServletContext();
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext );
  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/wangzhongqiu/p/6608130.html
Copyright © 2011-2022 走看看