容器 是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. noip2003提高组题解

    这一年的前三题虽然难度不高,但是第二题极为繁琐,想在考场上用较短的时间拿到第二题的分数难上加难.所以必须要调整策略,争取拿其他三题的分数.第四题是比较普通的搜索题,分数比较好拿,但是很容易想成树形DP ...

  2. Nginx源码安装及调优配置

    导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前的优 ...

  3. Android WindowManager 监听返回键及home键

    一.监听home键盘,Android Home键系统负责监听,捕获后系统自动处理.有时候,我们需要监听home键处理自己的逻辑,监听方法如下: /** * 监听home键广播 */ private f ...

  4. java web 学习十五(jsp基础语法)

    任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...

  5. 软件测试技术(六)——白盒测试之控制流覆盖准则+Visual Studio 2013单元测试

    一.目标程序 单片机发送的A/D转换结果的整体格式为:[DLE][STX]Message[CHKSUM][DLE][ETX],其中[]括号中的字符为16进制的助记符,并非ASCII码.其中:[DLE] ...

  6. 帮同事写了几行代码,在 安装/卸载 程序里 注册/卸载 OCX控件

    写了个小控制台程序,这个程序用来注册 / 卸载OCX控件,用在Inno Setup做的安装卸载程序里. #include "stdafx.h" #include <windo ...

  7. C++第一章概述

    1:C++主要是对于C的继承性做的相当的出色,主要扩充在于程序员可以自己定义自己的数据结构,用数据结构去描述日常生活中的事务,而不是C语言中当当仅有的Struct数据类型等等 2: 每一种语言都有自己 ...

  8. sqlServer 取每组的前几条数据

    首先的建表语句: ) DROP TABLE [test] CREATE TABLE [test] ( [id] [, ) NOT NULL , [name] [nvarchar] () NULL , ...

  9. 【暑假】[实用数据结构]范围最小值问题(RMQ)

    范围最小值问题: 提供操作: Query(L,R):计算min{AL ~ AR } Sparse-Table算法: 定义d[i][j]为从i开始长度为2j的一段元素的最小值.所以可以用递推的方法表示. ...

  10. Codeforces 364

    A 第一题明显统计,注意0和long long(我WA,RE好几次) /* * Problem: A. Matrix * Author: Shun Yao */ #include <string ...