IOC:Inversion of Control(控制反转)。IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想。IOC的核心思想就体现在控制、反转这两个词上面,要理解就必须要理解几个问题:

1、谁控制谁?在传统的开发工作中,我们一般都是主动去new一个对象,这个是主动控制依赖对象。但是对于IOC而已,控制权会被移交给容器,所以应该是IOC容器控制对象。

2、控制什么?既然是IOC容器控制对象,那控制什么呢?IOC容器除了负责控制对象的生成还包括外部资源的获取。

3、为何是反转?对象主动生成依赖对象,我们称之为“正转”,但是现在有IOC来负责了,所以反转则是IOC容器来负责对象的生成和注入过程。

4、那些地方反转?依赖对象的获取被反转了。

对于IOC而言,它强调是将主动变为被动,由IOC容器来负责依赖对象的创建和查找,由IOC容器来进行注入组合对象。将原来的强联系、高耦合转变为了弱关系、松耦合。IOC,它能指导我们如何设计出松耦合、更加优良的程序,把应用程序从原来需要维护依赖对象之间关系中彻底解放出来而更加专注于业务逻辑,这样会使得程序的整个体系机构变得非常灵活。

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

有了IOC就有必要提到DI了。DI,Dependency Injection,即“依赖注入”。其实IOC和DI本就是同一个概念的两种不同的表述,DI所描述的是由容器动态地将某个依赖关系注入到主键当中去,其需要理解如下几个概念:

1、谁依赖谁?应用程序依赖IOC容器。

2、依赖什么?因为应用程序不再主动去创建对象,由IOC容器来向应用程序注入,所以应该是应用程序依赖IOC容器来提供的外部资源。

3、谁注入谁?由IOC容器向应用程序注入。

4、注入什么?注入的某个对象所依赖的外部资源。

通俗点将就是IOC就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序;而DI是应用程序依赖容器提供的外部对象,容器将其依赖的外部资源在运行期注入到应用程序中。两者表达的意思都是容器负责应用程序的创建和管理,应用程序只需要在需要它们的时候等待容器将其所依赖的外部资源提供就行,至于来自哪里,怎么来的应用程序都不需要知道。

具体的IOC理解我就不多阐述了,网上实在是太多了,这里推荐几篇博客:

1、谈谈对Spring IOC的理解

2、【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3

3、Spring的IOC原理[通俗解释一下]

4、spring ioc原理(看完后大家可以自己写一个spring)

IOC结构体系

IOC作为一个容器,它里面放得都是bean、bean与bean之间的对应关系,而bean之间的对应关系我们开始都是通过xml配置文件来体现的。那么这里就反馈了如下几个问题:

1、对应与对象之间的关系是通过xml配置文件来描述的(当然也可以是properties等文件)。

2、描述的文件存放位置在那里,一般来说我们都是放在classpath目录下的,但是也可是是URL、fileSystem。

3、文件的解析。

4、Bean在容器中的表现形式,也就是它的数据结构。

对于Spring而言,它用Resource、BeanDefinition、BeanDefinitionReader、BeanFactory、ApplicationContext五个组件来实现以上问题,而同时这5个接口定义了 spring ioc 容器的基本代码组件结构。下面我们逐一了解这五个结构

Resource

Resource,对资源的抽象,它的每一个实现类都代表了一种资源的访问策略,如ClasspathResource 、 URLResource ,FileSystemResource 等。

 

BeanDefinition

用来描述和抽象一个具体的Bean对象,它是描述Bean对象的基本数据结构。

BeanDefinitionReader

外部资源所表达的语义需要统一转化为统一的内部数据结构BeanDefinition,这个时候BeanDefinitionReader就起到统一解析的作用力了。对应不同的描述需要有不同的 Reader 。如 XmlBeanDefinitionReader 用来读取xml 描述配置的 bean 对象。

BeanFactory

BeanFactory是一个非常纯粹的bean容器,它是IOC必备的数据结构,其中BeanDefinition是她的基本结构,它内部维护着一个BeanDefinition map,并可根据BeanDefinition 的描述进行 bean 的创建和管理。

 

 

ApplicationContext

这个就是大名鼎鼎的Spring容器,它叫做应用上下文,与我们应用息息相关,她继承BeanFactory,所以它是BeanFactory的扩展升级版,如果BeanFactory是屌丝的话,那么ApplicationContext则是名副其实的高富帅。由于ApplicationContext的结构就决定了它与BeanFactory的不同,其主要区别有:

1、继承MessageSource,提供国际化的标准访问策略。

2、继承ApplicationEventPublisher,提供强大的事件机制。

3、扩展ResourceLoader,可以用来加载多个Resource,可以灵活访问不同的资源。

4、对Web应用的支持。

下图是上面组合关系图(以ClasspathXmlApplicationContext 为例)

以上图片均来自:啃啃老菜: Spring IOC核心源码学习(一)

 

下面LZ将尽全力阐述IOC的初始化过程和在该过程中涉及的重要组件,这系列博客是也是LZ学习、研究Spring机制和源码的学习笔记,其中难免会参考别人的博客,如有雷同,纯属借鉴。同时也避免不了错误之处,博文中的错误望各位博友指出,不胜感激!!!

参考资料

1、啃啃老菜: Spring IOC核心源码学习(一)

【初探Spring】------Spring IOC(一)的更多相关文章

  1. Spring的IOC和AOP之深剖

    今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...

  2. Spring框架IOC容器和AOP解析

    主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.S ...

  3. Spring总结—— IOC 和 Bean 的总结

    一.Spring 官方文档中给出的 Spring 的整体结构. 二.我自己所理解的 Spring 整体结构图. 三.本次总结 Spring 核心部分 1.从上面图中可以看出,Beans 和 Conte ...

  4. spring的IOC和AOP

     spring的IOC和AOP 1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是 ...

  5. spring容器IOC创建对象<二>

    问题?spring是如何创建对象的?什么时候创建对象?有几种创建方式?测试对象是单例的还是多例的 ?对象的初始化和销毁? 下面的四大模块IOC的内容了!需要深刻理解 SpringIOC定义:把对象的创 ...

  6. Spring中IoC的入门实例

    Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如 ...

  7. Spring中IOC和AOP的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过s ...

  8. Spring的IoC应用

    IoC(Inversion of Control,控制反转) Spring的IoC应用是其框架的最大的特点,通过依赖注入可以大大降低代码之间的耦合度,从而实现代码和功能之间的分离.在代码中可以不直接和 ...

  9. Spring 实践 -IoC

    Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...

  10. 挖坟之Spring.NET IOC容器初始化

    因查找ht项目中一个久未解决spring内部异常,翻了一段时间源码.以此文总结springIOC,容器初始化过程. 语言背景是C#.网上有一些基于java的spring源码分析文档,大而乱,乱而不全, ...

随机推荐

  1. mobx @computed的解读

    写在前面:我一开始看不懂官网的@computed的作用,因为即使我把@computed去掉,依然能正确的report,然后我百度谷歌都找不到答案,下面都是我自己的理解,如果是有问题的,不对的,请务必留 ...

  2. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  3. CodeSimth - .Net Framework Data Provider 可能没有安装。解决方法

    今天想使用CodeSimth生成一个sqlite数据库的模板.当添加添加数据库的时候发现: .Net Framework Data Provider 可能没有安装. 下面找到官方的文档说明: SQLi ...

  4. Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现

    前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...

  5. PhotoView实现图片随手势的放大缩小的效果

    项目需求:在listView的条目中如果有图片,点击条目,实现图片的放大,并且图片可以根据手势来控制图片放大缩小的比例.类似于微信朋友圈中查看好友发布的照片所实现的效果. 思路是这样的:当点击条目的时 ...

  6. 写出易调试的SQL

    h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...

  7. ASP.NET Core 中文文档 第五章 测试(5.2)集成测试

    原文: Integration Testing 作者: Steve Smith 翻译: 王健 校对: 孟帅洋(书缘) 集成测试确保应用程序的组件组装在一起时正常工作. ASP.NET Core支持使用 ...

  8. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  9. iOS从零开始学习直播之1.播放

      对于直播来说,客户端主要做两件事情,推流和播放.今天先讲播放. 播放流程 1.拉流:服务器已有直播内容,从指定地址进行拉取的过程.其实就是向服务器请求数据. 2.解码:对视屏数据进行解压缩. 3. ...

  10. Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]

    1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...