一、ioc容器

ioc (inversion of  control)即控制反转,把某一个接口选择实现类的控制权转移给Spring容器来管理。调用类对该实现类的依赖关系由ioc容器注入(DI),传统的应用程序我们都是在类内部创建依赖对象,而Spring采用依赖注入的方式即 DI ,从而降低了类与类之间的耦合度。

一般我们把BeanFactory称为ioc容器,把ApplicationContext称为应用上下文,是Spring的核心。

二、当Spring容器启动时,首先会读取配置文件中的相关信息,并在Spring容器中生成一份bean配置信息注册表(BeanDefinition),然后根据配置信息注册表实例化bean装配bean之间的依赖关系,然后将bean实例放入bean缓存池中供应用程序使用。bean缓冲池由HashMap实现的,以bean的beanName为键。

三、BeanFactory

继承关系

BeanFactory bf=new XmlBeanFactory(new ClassPathResource("beans.xml"));
bf.getBean("");
ResourcePatternResolver rpr=new PathMatchingResourcePatternResolver();
Resource r=rpr.getResource("com/lq/ioc/beans.xml");
BeanFactory bf=new XmlBeanFactory(r);

ApplicationContext

继承关系

ApplicationContext ctx =new ClassPathXmlApplicationContext("com/lq/ioc/beans.xml");

        ApplicationContext ctx =new FileSystemXmlApplicationContext("com/lq/ioc/beans.xml");

        ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"conf/beans1.xml","conf/beans2.xml"});

ApplicationContext和BeanFactory的区别:

1、ApplicationContext 在容器启动时会把所有单实例的bean放入缓冲池中,可以通过配置lazy-init=true来延迟加载,  BeanFactory则采用延迟加载的形式,在容器启动时并不会实例化bean,直到第一次加载的时候才去实例化bean.对于单实例的bean,ApplicationContext中每次取出来都是同一个,而BeanFactory则每次取出来的是不同的bean.

2、两者均支持BeanPostProcessor、BeanFactoryPostProcessor(后置处理器)的使用,但是BeanFactory要通过  addBeanPostProcessor(new MyBeanPost())来手动注册,ApplicationContext则不需要手动注册。

WebApplicationContext

只能在web环境中使用,从WebApplicationContext中可以获得ServletContext的引用,整个web应用上下文对象将作为属性放入ServletContext中,Spring提供一个工具类WebApplicationContextUtils中的getWebApplicationContext(ServletContext sc)可以获得WebApplicationContext实例。

继承关系

由于 Web 应用比一般的应用拥有更多的特性,因此WebApplicationContext 扩展了ApplicationContext。WebApplicationContext 定义了一个常量ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,在上下文启动 时,WebApplicationContext 实例即以此为键放置在ServletContext 的属性列表中,因此我们可以直接通过以下语句从Web 容器中获取
WebApplicationContext:
WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

在web.xml文件中的配置

1、使用监听的方式
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/student.xml, /WEB-INF/person.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/student.xml, /WEB-INF/person.xml </param-value>
</context-param> <servlet>
<servlet-name>springContextLoaderServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet </servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

Spring ioc容器的更多相关文章

  1. Spring IoC容器的初始化过程

    Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...

  2. 【Spring】非Spring IOC容器下获取Spring IOC上下文的环境

    前言 在Spring Web项目中,有些特殊的时候需要在非Spring IOC容器下获取Spring IOC容器的上下文环境,比如获取某个bean. 版本说明 声明POM文件,指定需引入的JAR. & ...

  3. 学习Spring(一) 实例化Spring IoC容器

    实例化Spring IoC容器 1,读取其配置来创建bean实例 2,然后从Spring IoC容器中得到可用的bean实例 Spring提供两种IoC容器实现类型 a,一种为bean工厂 b,应用程 ...

  4. MyEclipse Spring 学习总结一 Spring IOC容器

    一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...

  5. 对Spring IoC容器实现的结构分析

    本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...

  6. spring IOC容器实例化Bean的方式与RequestContextListener应用

    spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...

  7. 解读Spring Ioc容器设计图

    在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...

  8. 纯注解快速使用spring IOC容器

    使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...

  9. Spring IOC容器分析(2) -- BeanDefinition

    上文对Spring IOC容器的核心BeanFactory接口分析发现:在默认Bean工厂DefaultListableBeanFactory中对象不是以Object形成存储,而是以BeanDefin ...

  10. Spring IOC容器分析(4) -- bean创建获取完整流程

    上节探讨了Spring IOC容器中getBean方法,下面我们将自行编写测试用例,深入跟踪分析bean对象创建过程. 测试环境创建 测试示例代码如下: package org.springframe ...

随机推荐

  1. Docker指令集

     FROM            语法:FROM <image>[:<tag>]         解释:设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile ...

  2. $.getJSON在IE8下失效

    $.getJSON("/Home/GetData?r=" + Math.random(), { ids: ids }, function(data) { //处理逻辑 }); 原因 ...

  3. 初学python之urllib

    urllib.request urlopen()urllib.urlopen(url, data, proxies) :创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远 ...

  4. SDcard

    import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import ja ...

  5. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  6. c#文件读入与写入

    1.用File对象读写文件(入磁盘): File.读:关注与逐行处理文件内容:选择File.ReadAllLines(FilePath,Encoding.(指定读取的文件编码格式)),返回字符串数组. ...

  7. C# 串口操作系列(3) -- 协议篇,二进制协议数据解析

    原文地址:http://blog.csdn.net/wuyazhe/article/details/5627253 我们的串口程序,除了通用的,进行串口监听收发的简单工具,大多都和下位机有关,这就需要 ...

  8. C语言基础补习

    coolshell 中一个小例子在VC6.0编译后反汇编结果仅作记录: 源码: #include <stdio.h> int main(void) { ]; printf("%x ...

  9. FastReport 中添加二维码功能.(Delphi)

    http://www.cnblogs.com/fancycloud/archive/2011/07/24/2115240.html FastReport 中添加二维码功能.(Delphi)   在实际 ...

  10. java实现简单的验证码(待增强)

    package com.xxx; import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.a ...