思考之spring的ioc
控制反转 英语:Inversion of control,缩写为IoC
我想很多同学都会思考过这样的一个问题,控制反转,什么地方反转了,是不是翻译的不对?
这里插一句
当年马云借着盖茨的嘴说:“互联网会改变世界。”其实是他自己说的,因为那时侯没有人认识马云,如果我说是翻译错误,大家肯定拍砖说我没理解。
大家对spring都用了很多年,有喜欢看书的同学一定会看到过spring 技术内幕,非常棒的一本书,没看的看过这篇博客之后记得买一本。
细心的同学可能会记得这样一句话
早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了。基于这个结论,他为控制反转创造了一个更好的名字:依赖注入。--摘自维基百科
其实他真的翻译的不够友好,所以后来才有了依赖注入(Dependency Injection,简称DI)。其实他们说的是一个意思。
bean的历史及工场模式:
最原始的bean是直接new出来的,后来出来了工场,把所有的bean放到工厂里统一生产,但还是写new,只不过这个new放在一个方法里了。再后来就是依赖注入帮了我们大忙,我们看不见new了。其实spring ioc就是一个大工厂 BeanFactory
有好多同学说过接口有什么用?我不用接口一样写代码,我不用spring一样new.
OOP的三个特性是封闭继承和多态,三个特性,继承和多态就占了两个,学java的人都应该看think in java。里面也强调了代码复用的三个方式是组合,继承和代理。这六点其实非常重要。
think in java引入过一个名词叫做"客户端程序员",其实我们所有应用框架的人都是客户端程序员,那么框架的设计的要想到可扩展性和代码的复用性以及兼容性。想想spring就很容易理解,这些都需要接口。
有接口就会有多态,有多态就需要修改new后边的代码,如果这些写到代码里,很多的话,重构就会带来问题。这是第一点;其二通过ioc可以实现bean的
统一管理,很方便,对bean的依赖关系一目了然,很容易把握全局,利于分析。所以ioc确实是非常有用的,是很棒的思想。
从字面上理解,两个词,一个是依赖一个是注入。
谭浩强说过这样一句话:“程序=算法+数据结构”
所以分析Ioc我们从数据结构入手。它实际上有一个beanDefinition 的定义类,要实现注入首先我们要知道某个bean 的class及这个class的依赖关系,然后通过递归进行实例化并注入。
大家都知道spring的bean有两种形式,singleton及prototype
其实了解这些思想之后我们很容易想到其实就是通过对xml的解释来实生成bean的过程,如果是singleton那么我们直接缓存bean.如果是protoype我们缓存class.
所以归结起来最核心的功能就是对xml的解析及递归调用的算法,感兴趣的同学可以参考我框架中的ioc 包,里边有具体实现。
思考之spring的ioc的更多相关文章
- Spring的IOC和AOP之深剖
今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...
- spring框架--IOC容器,依赖注入
思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action 多个 [维护成员变量] service 一个 [不需要维护公共变量] dao 一个 [不需要维护 ...
- 【死磕 Spring】----- IOC 之深入理解 Spring IoC
在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...
- 谈谈Spring的IoC之注解扫描
问题 IoC是Inversion of Control的缩写,翻译过来即"控制反转".IoC可以说是Spring的灵魂,想要读懂Spring,必先读懂IoC.不过有时候硬着头皮 ...
- Spring的Ioc与DI
一.前言 Spring框架的核心基于控制反转的原理. IoC是一种将组件依赖关系的创建和管理外部化的技术. 考虑一个示例,其中Foo类依赖于Bar类的实例来执行某种处理. 传统上,Foo使用new运算 ...
- Spring框架IOC容器和AOP解析
主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置 一.S ...
- Spring总结—— IOC 和 Bean 的总结
一.Spring 官方文档中给出的 Spring 的整体结构. 二.我自己所理解的 Spring 整体结构图. 三.本次总结 Spring 核心部分 1.从上面图中可以看出,Beans 和 Conte ...
- spring的IOC和AOP
spring的IOC和AOP 1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是 ...
- spring容器IOC创建对象<二>
问题?spring是如何创建对象的?什么时候创建对象?有几种创建方式?测试对象是单例的还是多例的 ?对象的初始化和销毁? 下面的四大模块IOC的内容了!需要深刻理解 SpringIOC定义:把对象的创 ...
随机推荐
- DataGrid中取HyperLinkColumn列的值,处理DataGrid中绑定的特殊字符
DataGrid中取HyperLinkColumn列的值. /// <summary> /// 对datagrid中标签进行编码,处理特殊字符 /// </summary> / ...
- 转载 @html.ActionLink的几种参数格式
一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法, ...
- EXTJS4.2 控件之Grid 行点击事件
listeners: { 'itemclick': function (view, record, item, index, e) { //Ext.MessageBox.alert("标题& ...
- Calendar GData API / Google Calendar Connectors deprecation
http://googleappsupdates.blogspot.fr/2014/06/calendar-gdata-api-google-calendar.html
- HttpClient抓取网页内容简单介绍
版本HttpClient3.1 1.GET方式 第一步.创建一个客户端,类似于你用浏览器打开一个网页 HttpClient httpClient = new HttpClient(); 第二步.创建一 ...
- iOS5编程--ARC在工程上的相关设置
在创建工程的时候,我们可以指定工程是否使用ARC技术,如下图 选中表示支持ARC, 在Beta5以前的版本中,不提供这个选项,非常麻烦. 如果是你拿到的工程,那么可以通过设置来改变,如下图所示 如果不 ...
- Interlocked.Increment 方法 和Interlocked.Decrement 方法作用
Interlocked.Increment 方法:让++成为原子操作:Interlocked.Decrement 方法让--成为原子操作.什么叫原子操作呢.就是不会被别人打断,因为C#中的一个语句,编 ...
- Netty4.x中文教程系列(一) Hello World !
1.下载并为项目添加Netty框架 1. Netty的包大家可以从Netty官网:http://netty.io/downloads.html 下载 如图所示: Netty提供了四个个主要版本的框架包 ...
- centos7安装chrome及加载poatman开发插件
为什么要安装chrome?因为centos7的默认浏览器firefox的实在是不习惯,上面占了太多,本来显示器就不大... 好了,首先下载chome的rpm安装包(如果需要的可以留言,我有备份) 然后 ...
- obj转换成数组
原则上obj是不能转换成数组的.首先array也是obj.只是一个特殊的object. obj一个很关键的点,是拥有成员和方法,撇开方法不说,obj就是一个key-value结构.也就是哈希数组,而j ...