读书人

Spring统制反转/依赖注入(转)

发布时间: 2012-11-06 14:07:00 作者: rapoo

Spring控制反转/依赖注入(转)
Spring控制反转/依赖注入
看了n篇文章也不明白控制反转到底是在说什么,今天终于看到一个像样的解释。以下内容选自于《Spring从入门到精通》作者:郭锋 清华大学出版社 出版时间:2006年10月 引自:CSDN读书频道 地址:http://book.csdn.net/bookfiles/250/index.html(本人帖在这只是为了学习方便,希望不涉及侵权问题)

在第2章中,笔者通过两个简单的实例展示了Spring的IoC功能,接下来将对Spring的IoC进行详细的讲解,因为Spring的核心就是IoC。在本章中,首先从IoC的基本思想开始,然后通过实例的方式使读者对其概念和工作原理有一个深入的了解,最后会把第2章中的第一个实例进行改编,使其通过构造方式来实现同样的功能。

3.1 反向控制/依赖注入
近年来,在Java社区中掀起了一股轻量级容器的热潮,几乎每隔一段时间,就会有新的轻量级容器出现,这些轻量级的容器能够较好地帮助开发者快速地将不同的组件组装成一个应用程序。在这些轻量级的容器的背后,有一个共同的模式决定着容器装配组件的方式,就是“反向控制”,即IoC,英文全称是Inversion of Control。Martin
Fowler深入地探索了“反向控制”的工作原理,并为其起了一个新的名字叫做“依赖注入”,即DI,英文全称是Dependency Injection。关于Martin Fowler的这篇文章,读者可以在其网站上看到,网址是http://www.martinfowler.com/articles/injection.html。
3.1.1 反向控制(IoC)
单从字面上,其实很难理解“反向控制”所要表达的含义。其实在编程时,开发人员常说的“实现必须依赖抽象,而不是抽象依赖实现”就是“反向控制”的一种表现方式。下面,笔者主要通过举例来说明这个抽象的概念。这个实例主要说明的是如何通过IoC来实现业务逻辑从哪种数据库中取数据的问题。可能的取数据方式有3种,分别是:
● 从SQL Server数据库中取数据。
● 从DB2数据库中取数据。
● 从Oracle数据库中取数据。
介绍这个实例的思路是:首先介绍编写这类程序通常的做法,然后指出这种做法的不足,接着给出一种比较好的做法,即通过IoC来实现这类功能,最后对这种做法进行总结,使读者一步一步地了解IoC。编写这类程序通常做法的具体步骤如下:
(1)通常编写这类程序都是先编写一个从数据库取数据的类SqlServerDataBase.java,这里以从SQL
Server数据库中取数据为例。SqlServerDataBase.java的示例代码如下。其中getDataFromSqlServer()是SqlServerDataBase类中的一个方法,具体负责从SQL Server数据库中取数据。

//******* TestHelloWorld.java**************package com.gc.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import com.gc.action.HelloWorld;public class TestHelloWorld {            public static void main(String[ ] args) {                  //通过ApplicationContext来获取Spring的配置文件                      ApplicationContext actx=new FileSystemXmlApplicationContext("config.xml");                      HelloWorld HelloWorld = (HelloWorld) actx.getBean("HelloWorld");                      System.out.println(HelloWorld.getMsg());       } }


3.3.4 运行测试程序并查看输出结果
在Eclipse中运行Java程序的步骤如下:
(1)确保当前在Eclipse中编辑的是TestHelloWorld.java文件。
(2)选择Run→Run As→Java Application命令,Eclipse即可运行TestHelloWorld.java。
(3)输出结果为“HelloWorld”,如图3.1所示。

图3.1 输出结果为“HelloWorld”

3.4 使用哪种注入方式
至于要使用构造注入或Set注入来完成依赖注入这个问题,其实就是在讨论:要在对象建立时就准备好所有的资源,或是在对象建立好后,使用Set注入来进行设定。
因为网络上关于这个的讨论太多了,各有各的道理,所以在这里不想再进行讨论,只是将笔者在实际工作中的一些经验分享给读者。
使用构造注入可以在建构对象的同时一并完成依赖关系的建立,对象一建立则所有的一切也就准备好了,但如果要建立的对象关系很多,使用构造注入会在建构函式上留下一长串的参数,且不易记忆,这时使用Set注入会是个不错的选择。
使用Set注入可以有明确的名称,可以了解注入的对象会是什么,像setXXX()这样的名称会比记忆Constructor上某个参数位置代表某个对象更好。
然而使用Set注入由于提供了setXXX()方法,所以不能保证相关的数据成员或资源在执行时不会被更改设定,所以如果开发人员想要让一些数据成员或资源变为只读或是私有,使用构造注入会是个简单的选择。
3.5 小 结
Spring的核心是个IoC容器,用户可以用Setter或Constructor的方式来实现自己的业务对象。至于对象与对象之间的关系建立,则通过组态设定,让Spring在执行时根据组态的设定来建立对象之间的依赖关系,开发人员就不必特地撰写一些Helper来自行建立这些对象之间的依赖关系,这不仅减少了大量的程序撰写,也降低了对象之间的耦合程度。当读者了解了IoC的工作原理和一些基本使用方法后,也就对Spring的核心有了一定的认识,接下来从第4章开始笔者将详细讲解Spring的语法。

读书人网 >编程

热点推荐