容器 是Spring框架的核心,是组件存活的地方。Spring容器使用DI管理所有组成应用系统的组件,协作组件之间建立联。而且,

这些对象简洁易懂,降低耦合性,支持重用,容易被测试。

Spring提供了多种容器实现,可分为两类:Bean工厂 和应用上下文 。

1. BeanFactory :由org.springframework.beans.factory.BeanFactory接口定义,是最简单的容器,提供了基础的依赖注入支持。

BeanFactory采用了工厂设计模式,负责创建和分发各种类型的Bean,创建协作对象间的关联关系,管理Bean的生命周期,调用

用户定义的初始化和销毁方法(如果定义了这些方法的话)等。

BeanFactory有多种实现,其中,最常用的是XMLBeanFactory,它根据XML文件中的定义装载Bean。在创建XMLBeanFactory

时,需要传递一个org.springframework.core.io.Resource的实例给构造器,此Resource实例用来提供XML文件给BeanFactory。

Spring提供了以下多种Resource的实现:

    Resource实现 描述
    1. org.springframework.core.io.ByteArrayResource 定义内容由一组字节给定的资源
    2. org.springframework.core.io.ClassPathResource 定义可从classpath提起的资源
    3. org.springframework.core.io.DescripiveResource 定义包含资源描述符,但实际没有可读资源的资源
    4. org.springframework.core.io.FileSyatemResource 定义可从文件系统提取的资源
    5. org.springframework.core.io.InputStreamResource 定义可从输入流提取的资源
    6. org.springframework.core.io.UrlResource 定义可从给定URL提取的资源
    7. org.springframework.web.portlet.context.PortletContextResource 定义可用在portlet上下文中的资源
    8. org.springframework.web.context.support.ServletContextResource 定义可用在servlet上下文中的资源

例如使用FileSystemResource来创建一个XMLBeanFactory,代码如下:

  1. /**
  2. * Bean工厂从"c:/beans.xml"文件中读取Bean的定义信息,并启动容器。
  3. * Bean载入时间:此时,Bean工厂并没有实例化Bean。即Bean是被延迟载入到Bean工厂中的,
  4. * 在需要使用Bean的时候(调用getBean("beanName"))才被实例化。
  5. */
  6. BeanFactory factory = new XmlBeanFactory(new FileSystemResource("c:/beans.xml"));
  7. /**
  8. * 实例化Bean,并使用依赖注入设置Bean的属性及关联关系等。
  9. */
  10. MyBean myBean = factory.getBean("myBean");

2. ApplicationContext :由org.springframework.context.ApplicationContext接口定义,建立在BeanFactory基础之上,提供了系统构架

服务。如:文本信息解析工具,包括对国际化(I18N)的支持;载入文件资源的通用方法;可以向注册为监听器的Bean发送事件等。

ApplicationContext的诸多实现中,经常会用到的有以下三种实现:

   ApplicationContext实现 描述
   1. org.springframework.context.support.ClassPathXMLApplicationContext 从类路径中的XML文件载入上下文定义信息
   2. org.springframework.context.support.FileSystemXmlApplicationContext 从文件系统中的XML文件载入上下文定义信息
   3. org.springframework.web.context.support.XMLWebApplicationContext 从Web系统中的XML文件载入上下文定义信息

从文件系统或者类路径载入应用上下文与将Bean载入BeanFactory类似,例如:

  1. /**
  2. * Bean载入时间:在上下文启动后预载入所有的单实例Bean,确保在使用前已经准备好了,不需要等待它们被创建。
  3. */
  4. ApplicationContext context1 = new FileSystemXmlApplicationContext("c:/beans.xml");
  5. MyBean myBean = factory.getBean("myBean");
  1. ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
  2. MyBean myBean = factory.getBean("myBean");

使用FileSystemXmlApplicationContext与ClassPathXMLApplicationContext的区别是:

前者只能在指定的路径中查找;后者可在整个类路径(包括JAR文件)中查找XML文件。

3. 如何选择使用容器?

ApplicationContext包含BeanFactory的所有功能,几乎所有的应用系统都选择ApplicationContext而不是BeanFactory。

只有在资源很少的情况下,才会考虑采用BeanFactory,如在移动设备上等。

Spring 的两个配置容器的讲解的更多相关文章

  1. 浅谈Spring的两种配置容器

    浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41   作者:黄小鱼ZZZ     ...

  2. spring aop两种配置方式

    基于注解的Spring AOP开发 简单案例快速入门 定义目标类接口和实现类 /** * Created by zejian on 2017/2/19.*/ //接口类 public interfac ...

  3. spring aop两种配置方式(1)

    第一种:注解配置AOP注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before ...

  4. java框架篇---spring aop两种配置方式

    第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...

  5. spring与springMVC的父子容器关系

    背景和概述 在spring与springMVC中通过IOC可以管理bean对象,有两个配置文件可以配置ioc spring的配置文件applicationContext.xmlspringMVC的配置 ...

  6. Spring(二)核心容器 - 简介 、BeanFactory、ApplicationContext

    目录 前言 1.容器简介 2.容器的结构 2.1 BeanFactory 2.2 ApplicationContext 2.2.1 ConfigurableApplicationContext 2.2 ...

  7. Spring IOC-基于XML配置的容器

    Spring IOC-基于XML配置的容器 我们先分析一下AbstractXmlApplicationContext这个容器的加载过程. AbstractXmlApplicationContext的老 ...

  8. 【Java】Spring之基于注释的容器配置(四)

    注释是否比配置Spring的XML更好? 基于注释的配置的引入引发了这种方法是否比XML“更好”的问题.答案是每种方法都有其优点和缺点,通常,由开发人员决定哪种策略更适合他们.由于它们的定义方式,注释 ...

  9. 这一次搞懂Spring Web零xml配置原理以及父子容器关系

    前言 在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的.基于约定大于配置的规定,Spring提供了很多注解帮助我 ...

随机推荐

  1. uestc 1725 吴神数

    // 筛选法// 先求出 sqrt(1<<31)内的素数// 然后筛选出符合要求的数// 详情见代码注释// #pragma comment(linker, "/STACK:10 ...

  2. Oracle 数据乱码

    原文 Oracle 数据乱码 服务器配置环境变量 NLS_LANG:American_america.ZHS16GBK        

  3. Android中ListView中有button,checkbox,GridView时事件问题

    最近做项目,用到了listview的item的一些问题,现在抽空把它们总结一下: 转载请表明出处:http://blog.csdn.net/wdaming1986/article/details/67 ...

  4. 【LeetCode 207】Course Schedule

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  5. C ~ 指针函数与函数指针的区别

    一. 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某 ...

  6. CSS快速制作图片轮播的焦点

    来源:http://www.ido321.com/858.html 效果图: 演示地址:http://jsfiddle.net/Web_Code/q5qfd8aL/embedded/result/ 代 ...

  7. Linux服务器下没有root权限装Matlab R2013a

    Matlab R2013a Unix版下载地址 注意:由于我是在单位的集群系统上装Matlab,没有root权限,故下载下来的.iso文件不能在linux下用mount命令挂载,故先在Win下解压,再 ...

  8. Cloudera 建议使用 NTP 使 Hadoop 群集实现时间同步

    主机的 NTP 服务未响应时钟偏差请求. 建议 这是主机运行状况测试,用于检查主机的系统时钟是否与其 NTP 服务器不同步.该测试能检查“ntpdc -c loopinfo”命令报告的主机时钟偏差绝对 ...

  9. Junit。。。

    keep the bar green to keep the code clean.

  10. work_7

    1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理解 局部变量分为动态局部变量和静态局部变量,其共同点为作用域均为定义它的函数体或语句块,其不同点为其生命周期 ...