基本概念

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. BZOJ5443:[CEOI2018]Lottery

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:https://www.lydsy.com/JudgeOnline/probl ...

  2. Centos6.5上的iptables

    1.Centos6.5默认开启了iptables 当Centos6.5上安装了MySQL后,在远程连接它,如果出现10060的错误,说明iptables在起作用. 关闭iptables即可,sudo ...

  3. C# 播放音乐

    用 .NET 自带的类库 System.Media 下面的 SoundPlayer 来播放音乐的方式,此种方式使用托管代码,应该是更为可取的方式吧 使用起来非常简单,下面稍作说明: . 支持同步.异步 ...

  4. JS ES6 -- let命令

    1.ES6新增了块级作用域的let和const 这新特性let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. for循环的计数器,就很合适使用let命令 ...

  5. 设置win7资源管理器启动时的默认位置-windows-操作系统-网页教学网

    设置win7资源管理器启动时的默认位置-windows-操作系统-网页教学网 如何设置win7资源管理器启动时的默认位置?我不太习惯 Win 7 的资源管理器默认总是打开库,我还是喜欢资源管理器打开树 ...

  6. Sharepoint 对于是否签出文件进行编辑区别

    在库设置----版本控制设置 一.需要签出才能编辑 例如需要对以上通用盒进行修改时,若在“使用资源管理器中打开”粘贴文件时会提示必须先签出项目 签出文件后,再粘贴文件到文档库中,可以选择签入的版本类型 ...

  7. Frequent Pattern 挖掘之二(FP Growth算法)

    Frequent Pattern 挖掘之二(FP Growth算法) FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断 ...

  8. 基于MapReduce的矩阵乘法

    参考:http://blog.csdn.net/xyilu/article/details/9066973文章 文字未得及得总结,明天再写文字,先贴代码 package matrix; import ...

  9. 3.Windows应急响应:蠕虫病毒

    0x00 前言 蠕虫病毒是一种十分古老的计算机病毒,它是一种自包含的程序(或是一套程序),通常通过网络途径传播, 每入侵到一台新的计算机,它就在这台计算机上复制自己,并自动执行它自身的程序.常见的蠕虫 ...

  10. 2. DVWA亲测CSRF漏洞

    DVWA登陆      用户名:admin   密码:password Low级: 查看源代码: <?php if (isset($_GET['Change'])) { // Turn requ ...