转自: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 );

【Spring】3、BeanFactory 和 ApplicationContext的区别的更多相关文章

  1. Spring中BeanFactory与ApplicationContext的区别

    BeanFactory:Bean工厂接口,是访问Spring Bean容器的根接口,基本Bean视图客户端.从其名称上即可看出其功能,即实现Spring Bean容器的读取. ApplicationC ...

  2. Spring中BeanFactory和ApplicationContext的区别

    1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期. 2. ApplicationContext除了提供上述BeanF ...

  3. BeanFactory和ApplicationContext的区别+部分Spring的使用

    BeanFactory和ApplicationContext的区别 ApplicationContext 方式加载:创建容器的同时 容器初始化,容器所有的bean创建完毕   Spring容器中获取一 ...

  4. Spring中的BeanFactory和ApplicationContext的区别

    我用一个例子去测试BeanFactory和ApplicationContext的区别 首先建立一个bean public class User { //声明无参构造,打印一句话,监测对象创建时机 pu ...

  5. Spring中BeanFactory与FactoryBean的区别

    在Spring中有BeanFactory和FactoryBean这2个接口,从名字来看很相似,比较容易搞混. 一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层 ...

  6. BeanFactory和ApplicationContext的区别(Bean工厂和应用上下文)

    https://blog.csdn.net/qq_20757489/article/details/88543252 https://blog.csdn.net/pythias_/article/de ...

  7. 【Java面试】Spring中 BeanFactory和FactoryBean的区别

    一个工作了六年多的粉丝,胸有成竹的去京东面试. 然后被Spring里面的一个问题卡住,唉,我和他说,6年啦,Spring都没搞明白? 那怎么去让面试官给你通过呢? 这个问题是: Spring中Bean ...

  8. Spring之BeanFactory与ApplicationConText区别

    使用BeanFactory从xml配置文件加载bean: import org.springframework.beans.factory.xml.XmlBeanFactory; import org ...

  9. BeanFactory 和 ApplicationContext的区别

    今天在网上查资料无意中看到这一行代码 BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext ...

  10. spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean

    1.Beanfactory和ApplicationContext有什么区别 ApplicationContext (1)在配置文件加载后创建bean 利用debug方式,在Student类的无参构造方 ...

随机推荐

  1. C# 嵌入dll

    在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形式总归让人不爽,那么有 ...

  2. JSON Web Token in ASP.NET Web API 2 using Owin

    In the previous post Decouple OWIN Authorization Server from Resource Server we saw how we can separ ...

  3. 日期时间类:Date,Calendar,计算类:Math

    日期时间类 计算机如何表示时间? 时间戳(timestamp):距离特定时间的时间间隔. 计算机时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(ms). 计算机中时间2 ...

  4. Linux系统日志分析与管理(14)

    当你的 Linux 系统出现不明原因的问题时,你需要查阅一下系统日志才能够知道系统出了什么问题了,所以说了解系统日志是很重要的事情,系统日志可以记录系统在什么时间.哪个主机.哪个服务.出现了什么信息等 ...

  5. nginx-https错误

    连接 ssl.acfun.tv 时发生错误. SSL 接收到一个超出最大准许长度的记录. (错误码: ssl_error_rx_record_too_long) 最后发现,是因为nginx里的配置包含 ...

  6. Linux - 针对用户账号的常用操作

    用户目录 除root用户外,其他默认的用户目录一般为/home/<user name>. 可以通过如下步骤修改默认用户目录 修改/etc/passwd文件中相应用户的路径信息 停止此用户的 ...

  7. Flask-Restful详解

    Restful API规范 restful api是用于在前端与后台进行通信的一套规范.使用这个规范可以让前后端开发变得更加轻松.以下将讨论这套规范的一些设计细节. 协议: 采用http或者https ...

  8. OwinHost

    新建ASP.NET MVC 项目. 引用包: install-package Microsoft.Owin.Host.SystemWeb 修改 public class Startup { publi ...

  9. RocketMq(一)初识消息中间件

    1.对消息的理解 消息即为数据(data),数据有一定的规则.长度.大小. Java Message Service(Java消息服务)简称JMS,为Java 程序提供一种通用的方式,来创建.发送.接 ...

  10. 全网最详细的Xshell或SecureCRT下spark-shell里出现无法退格或者删除的问题现象的解决办法(图文详解)

    不多说,直接上干货! 前言 打开spark的命令行后,发现输错字符了,但是无法退格或者删除,这是比较苦恼的问题. 这个问题,得看你是用Xshell,还是SecureCRT. 一般是出现在SecureC ...