春天不寒----谈spring的依赖注入

 

当我第一次看到spring的时候就觉得似曾相识。这分明就是反射+配置文件+工厂模式。这样的框架是按照一些准则把设计模式打包成高层的模式。而spring技术中最闪耀的名词绝对少不了控制反转(IoC),依赖注入(D Injection)和依赖倒置(D Inversion)

不管这些是方法论,还是模式,还是原则,有了这三样东西程序员的春天确实来了。不必再为了每一次的变化而心寒和纠结了。那么这又“反转”又“注入”又“依赖”的,到底是些什么东西呢?他们在干什么呢?不用行么?那么麻烦值得么?再有spring真的这么特别么,别的世界就没有spring么?

首先澄清下概念:“控制反转”,比方说本来你对某样事物有主动控制权,但是你却交了出去,那么你从主动控制转为被动,此即控制反转;“依赖注入”,一个实体依赖另一个实体,但在早期不体现这种依赖关系,而是把这种依赖关系提取出来,在后期注入回去;“依赖倒置”,以前高层依赖底层,但是底层变化后高层就没用了,后来不让高层依赖底层,让它依赖接口,这就是依赖的倒置,面向接口编程就是依赖倒置的灵魂。

以上是我用自己的话对几个概念的解释。不懂没关系,往下看。

    先讲个实际生活的例子,假如某一天,您和您一哥们出去吃饭。坐到餐馆以后,您哥们说,“吃什么啊?”;你懒洋洋的说“随便”。

好,故事先就此打住。您这一随便不要紧啊,把吃什么的控制权交了出去啊,于是您和具体食物的关系算是没有了,因为您哥们说得算了。这就是控制反转,本来您可以决定吃米饭还是馒头,但是现在你只知道等下有东西吃但是吃什么你不知道了,因为控制具体吃什么的是您哥们。不过有一条,他一定会给你点能吃的,不能搞来一把锤子,虽然你把控制权交了出去,但是你还是有最基本的要求,能吃,此为一个接口。而后来不管上什么都要实现这个能吃的接口,此为依赖倒置或者说面向接口编程。

接下来,您哥们仔细想了半天,在点菜单上画了这个涂了那个,可他就是不说点了什么,最后给服务员去做了。等了若干分钟,上来两碗米饭,一个小鸡炖蘑菇,一个酸辣土豆丝。

到了此时您才看到他点了什么菜叫了什么饭,这就是依赖注入了。本来您和米饭和小鸡炖蘑菇是有依赖关系的,因为你要吃它们,但是在开始的时候却把你们隔离开,到了吃的时候你才看到它们。

下面我把伪类图画出来

 

简单的写下代码:

 

Code

 

下面是beans-config.xml的主要内容

 

Code

    上面的代码基本演示了这个小故事和依赖注入等相关概念,但这并不是spring的标准开发,虽然这么做无可厚非,利用接口提供服务,并动态调用,这也是依赖注入的一种方式。Howeverspring只支持设值注入和构造注入,设值注入比较常用,如下更改就是spring的标准设值注入。

   

Code

而新的配置文件如下:

 

Code

这样改变以后,实现Eatable接口的类就会被springIoC容器动态注入到类You中,而类You也可以被包装成实现了某个接口的javabean,在更上层应用中使用那个接口来进行操作,而加载过程如出一辙。

spring世界里,整个流程被框架化了,用配置文件把使用者和javabean或者beanbean之间解耦。不管什么技术什么模式,要想解耦,一定会抽象出更多的中间层以增加间接性,直接的叫高内聚但是不灵活。为了灵活自己没事找事增加间接性。这就是spring干的事情。也是很多设计模式干的事。

那么回过头再说说,spring所体现出来的解耦,依赖注入是它的专利么?

这问题回答起来太干脆了:不是。在.NET世界,我们习惯使用反射来动态加载类,而在load时使用读配置文件的办法。这样高层的代码编译发布以后不用再变化,只需要改需要加载的装配件和配置文件就好了。

 

依赖注入就是把原先在一起但没必要在一起的两样东西分开,但是他们毕竟还是有关系的,所以我们就用胶水把他们再粘到一起。整个就是没事找事。

 

                                                    by 千冰念 @ YITIAN Studio

 

 

程序员的路是一行一行走出来的,不管多困难,我能做的只是,绝不低头。

posted on 2008-08-26 17:52 YITIAN Studio 阅读(1697) 评论(10)  编辑 收藏 网摘 所属分类: 6//模式架构

评论

#1楼 2008-08-26 18:03 啊东hd      

有自己的理解 不错   回复  引用  查看    

#2楼 2008-08-26 18:40 chegan      

相当形象   回复  引用  查看    

#3楼 2008-08-26 19:51 YYX      

LZ说的.net通过下用配置文件使用反射动态加载类,想必是需要自己动手写代码的吧,但是你却没法做到像spring那样,对于一个管理中的bean,想singleton就singleton,想prototype就prototype,生命周期尽在掌握.何况Ioc也只是spring核心的一小部分,spring还具有AOP的能力,还有定义全局Event的能力。
并且,作为一个程序员来讲,Spring吸引我们的并不是这些被热炒的东西,而是它真正拥有一个大型项目中需要的一切东西,比如dataSource,TransactionManager等,而它向上能整合struts,webwork,向下能整合hibernate,ibatis,jdbc。所以spring是一个真正能让程序员工作轻松下来的东西,并不是什么技术上的噱头
  回复  引用  查看    

#4楼 2008-08-26 19:53 金色海洋(jyk)      

居然是完全一样的思路,但是实现方式却完全的不一样。   回复  引用  查看    

#5楼 2008-08-26 20:59 XMLSpy      

在.net下Spring似乎不怎么火啊   回复  引用  查看    

#6楼[楼主] 2008-08-26 21:13 YITIAN Studio      

@啊东hd
@chegan
thanks for the encouragement form you two.
i am a new-comer.It's the first time that i got to something called spring.
thanks again.
frome 千冰念
  回复  引用  查看    

#7楼[楼主] 2008-08-26 21:57 YITIAN Studio      

@金色海洋(jyk)
@金色海洋(jyk)
you mean, the implementation of Spring in .NET freamwork and java have the same thoughts but different way??
you have a lot of experience in the development while i have almost none.
welcome here and give me(us) some guidance.
thx
from 千冰念
  回复  引用  查看    

#8楼 2008-08-26 22:16 hibernate gavin king[未注册用户]

兄弟,有没有思考过注入的效率如何?也就只有单实例注入比较快捷,因为有缓存.
其它的效率就比较差了,因为都是反射new个实例,没有缓存,也缓存不了,不知道我这点理解对不?还有aop也是反射实现,说真的,很多都用反射来解耦合,
算了,管它的,有时候真的是不要太钻牛角尖,做项目快和维护方便就好了,其它的不要管了

我估计再五年,spring,hibernate等技术会在net非常火,这是必然的,因为在java中已经那么流行了,何况net中很多开发方式还是很土的,写很多重复的代码
  回复  引用    

#9楼 2008-08-26 23:55 YYX      

@hibernate gavin king
反射的代码没多慢,读XML会慢些,不过xml信息都会在启动时就全部读入,相关的RTTI信息,单例也都在启动时准备好了,所以依赖注入在运行过程中不会慢的,就是工程在启动时稍微慢点。
至于你说的spring,hibernate等技术会在net非常火,我说不会的。因为搞.net开发没必要用spring这样的东西,比如dataSource,java有apache的dbcp,有c3p0的,有通过JNDI的...而微软那就一套,你没的选择。像hibernate,更不会火,因为微软都已经搞出来两套ORM框架了,而且还在不断完善中。
  回复  引用  查看    

#10楼 2008-08-27 07:38 金色海洋(jyk)      

用google翻译了一下你写的那段英文,大概知道了意思。

我说的是我的控件(组建、架构)的思路和spring的思路很像。通过配置信息来做一些事情。

但是spring完全是围绕class的,而我的是围绕过程的。

单一职责,才分到最小颗粒,才会有更灵活的组合,当然组合起来也就更费点事。

可能还是没有说清楚。等过几天,我把demo写出来的吧。
  回复  引用  查看    

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1276904




相关文章:

相关链接:
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

一天工作室,五个大学生组成的团队。最开始是为了做作业。 现在我们致力于做更好的自己。和所有大学生,程序员一起探讨技术,人生。这个博客会见证我们的成长。

留言簿

我参加的小组

随笔分类

相册

我的连接

积分与排名

最新评论

阅读排行榜

评论排行榜