基本概念

Spring 的 Ioc 容器,通常也称应用上下文。它包含了两个概念 Ioc 和 容器:

  • 容器:顾名思义就是用来装东西的,在 Spring 中容器里盛放的就是各种各样的 Bean。既然装了东西,那么理所应当的要控制东西何时盛放(添加),何时倒掉(移除),这就是所谓的 Bean 管理。因此 Spring 容器的作用是负责 Bean 的创建和管理。

  • Ioc:Inversion of Control,即控制反转,意指控制权的转换。原来创建 Bean 需要开发者利用 new 关键字创建 Bean 实例,现在 Spring 容器替我们完成了这一工作,开发者只需负责调用 Bean 即可。


Beanfactory

了解了 Spring 的 Ioc 容器作用后,接下来就要知道容器具体的指什么?在 Spring 中容器用 Beanfactory 指代。下面来看它的接口定义:

public interface BeanFactory {

    // 表示由 FactoryBean 创建的 Bean,与依赖注入有关
String FACTORY_BEAN_PREFIX = "&"; // 取得 Bean Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; // 容器中是否包含指定的 Bean
boolean containsBean(String name); // 判断 Bean 的属性(单例或原型,两者是对立关系) boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // 判断是否匹配指定的类型 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; // 取得 Bean 类型
Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 取得 Bean 的别名
String[] getAliases(String name); }

观察代码,可以发现接口中存放着各种 Bean,并提供了这些 Bean 的查询功能,所以才会将其抽象为容器。

现实生活中可以被称之为容器的东西有很多,如碗,杯子,水桶,盒子等等,它们除了共有的相同点——盛放东西外,各自作用也大相庭径,比如碗用来盛饭,杯子用来装水,盒子用来收纳物件。在 Spring 中也一样, BeanFactory 是容器的抽象,它存在着各种各样的子类,实现类,它们除了装载、管理 Bean 外,同样有着各自不同的作用。下面来看它的继承关系:

观察上图,发现一个特别的接口——ApplicationContext,该接口是 BeanFactory 的子接口,同样的有许多接口继承了它。所以在 Spring 中它的重要性毋庸置疑。


ApplicationContext

经过上面的分析,我们了解了 Spring Ioc 容器的作用,知道了容器在 Spring 代指 BeanFactory 。同时提到了该接口,如果是 BeanFactory 代指水杯,那么 ApplicationContext 就是不锈钢保温杯。除了盛水的作用外,还具备防摔,防锈,保温的功能。可以将其是理解为 BeanFactory 的高级形态,也称应用上下文。应用上下文在在简单容器的基础上添加了许多面向框架的特性。

首先来它的签名:

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver
  • ListableBeanFactory 是 Bean 相关的列表功能

  • HierarchicalBeanFactory 代表了支持层级功能

  • MessageSource 代表了支持 Spring的国际化信息

  • ApplicationEventPublisher 代表了支持 Spring的事件处理

  • ResourcePatternResolver 则资源相关的处理功能

再来看看该接口的定义:

String getId();  

String getDisplayName();  

long getStartupDate();  

ApplicationContext getParent();  

AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;  

ApplicationContext 虽然是 BeanFactory 的子接口,但是可以认为它不是一个 BeanFactory,ApplicationContext 对象里面包含了一个 BeanFactory 对象。

相关 Bean 基本功能是调用了其内部的一个BeanFactory 对象来实现的,而不是自己进行的实现。它对BeanFactory进行了一定的封装扩展,使其具备更多不同的功能。


参考

01.Spring Ioc 容器的更多相关文章

  1. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)

    一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 解读Spring Ioc容器设计图

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

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

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

随机推荐

  1. 苹果公司CEO乔布斯在斯坦福大学毕业典礼上的演讲

    苹果公司CEO乔布斯在斯坦福大学毕业典礼上的演讲 摘要:这是苹果公司CEO乔布斯2005年在斯坦福大学毕业典礼上的演讲,大学途中退学,创业,被解雇,东山再起,死亡威胁,这些他都一一经历了.经营自己与众 ...

  2. gradle项目搭建

    一.gradle安装 1.安装JDK,这个就不用说了 2.下载gradle发布文件,下载地址:http://gradle.org/gradle-download/可以下载完整版或者简洁版都可以 3.解 ...

  3. delphi 线程教学第二节:在线程时空中操作界面(UI)

    第二节:在线程时空中操作界面(UI)   1.为什么要用 TThread ?   TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节. 适合于大部分情况多线程任务的实现.这个理由足够了吧 ...

  4. 十道海量数据处理面试题 - 数据分析与数据挖掘技术-炼数成金-Dataguru专业数据分析社区

    1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^32个IP.同样可以采用映射的方法 ...

  5. C语言连接mysql -insert-update

    C语言连接mysql数据库实现insert语句:数据库:test表:systeminfo CREATE TABLE `systeminfo` (  `id` int(11) NOT NULL AUTO ...

  6. Flask03 路由控制(转换器)、反转、请求方法控制

    1 提出问题 如何实现前端传过去的路径时动态的(即:多个url对应一个url视图函数) 例如: 浏览器中输入 http://127.0.0.1:5000/test/good/ 或者 http://12 ...

  7. isPCR安装

    isPCR是用一对PCR引物搜索序列数据库.它使用索引策略来快速完成此操作.当搜索成功时,输出是fasta格式序列文件,其包含数据库中位于引物对之间的所有区域. Linux系统下安装 1. 使用二进制 ...

  8. 使用python ftplib包递归下载文件夹及文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-06-11 09:35:49 # @Author : Yaheng Wang ...

  9. 使用python已知平均数求随机数

    问题描述:产生40个数,范围是363-429之间,平均值为402 思路: 1 产生一个随机数 2 使用平均数减去随机数求出第二个数,生成20组 3 将排序打乱 # -*- coding: cp936 ...

  10. 《JavaScript语言精粹》第二章-语法 简单笔记

    注释 JavaScript提供两种注释: /* */包围的块注释及//开头的行注释. 注释应该被优先用来提高程序的可读性,注释要精确地描述代码,没有用的注释比没有注释更糟糕. /* */块注释对于被注 ...