首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

总结一上 Spring的IOC、DI

2012-10-14 
总结一下 Spring的IOC、DI/// summary/// 用户播放媒体文件/// /summarypublic class OperationMain{pu

总结一下 Spring的IOC、DI

/// <summary> /// 用户播放媒体文件 /// </summary> public class OperationMain { public void playMedia() { MediaFile _mtype = new MediaFile(); Player _player = new Player(); _player.play(_mtype); } } /// <summary> /// 播放器 /// </summary> public class Player { public void play(MediaFile file){ } } /// <summary> /// 媒体文件 /// </summary> public class MediaFile { }

结构很简单,于是代码大致如下:

package ioc;/** * @author: 特种兵—AK47 * @创建时间:2012-10-9 上午09:59:56 * * @类说明 :用户播放媒体文件 */public class OperationMain {public void playMedia(IPlayer iplayer, IMediaFile imediaFile) {iplayer.play(imediaFile);}}
package ioc;/** * @author: 特种兵—AK47 * @创建时间:2012-10-9 上午10:03:23 *  * @类说明 :要播放的媒体文件 */public interface IMediaFile {public void getSetPath();}

 

package ioc;/** * @author: 特种兵—AK47 * @创建时间:2012-10-9 上午10:03:39 *  * @类说明 : */public class Mp3File implements IMediaFile {@Overridepublic void getSetPath() {// TODO Auto-generated method stubSystem.out.println("播放 [Mp3] 格式的文件");}}


 

package ioc;/** * @author: 特种兵—AK47 * @创建时间:2012-10-9 上午10:03:39 *  * @类说明 : */public class Mp4File implements IMediaFile {@Overridepublic void getSetPath() {// TODO Auto-generated method stubSystem.out.println("播放 [Mp4] 格式的文件");}}

 

package ioc;/** * @author: 特种兵—AK47 * @创建时间:2012-10-9 上午10:02:41 *  * @类说明 :播放组件的抽象类 */public interface IPlayer {public void play(IMediaFile imediaFile);}

package ioc;/** * @author: 特种兵—AK47 * @创建时间:2012-10-9 上午10:02:59 *  * @类说明 : */public class Player implements IPlayer {@Overridepublic void play(IMediaFile imediaFile) {imediaFile.getSetPath();}}

测试程序:

package ioc;import org.junit.Test;/** * @author: 特种兵—AK47 * @创建时间:2012-10-9 上午10:08:25 *  * @类说明 : */public class IocTest {@Testpublic void testIoc() {OperationMain opmn = new OperationMain();opmn.playMedia(new Player(), new Mp3File());opmn.playMedia(new Player(), new Mp4File());}}

运行一下:

播放 [Mp3] 格式的文件播放 [Mp4] 格式的文件

上面代码进行了抽象,可以看到,目的是减少了依赖,但是看上去依赖关系增加了,如用户PlayMedia方法,依赖还增加了依赖接口和具体的实现,但是接口是稳定的,可以不考虑,具体的实现才是变动的,这个依赖还是要的,要播放文件,必定要用到具体的播放器和具体文件。

3.控制反转(IoC)/依赖注入(DI)

强调一下,IOC跟DI要表达的是一个意思

现实生活中,是具体的播放器和具体的媒体文件没有关系,你给它一个Mp3文件他可以播放,给它一个Mp4文件它也可以播放,你删掉你的媒体文件,播放器照样在,具体什么播放器,播放什么文件,控制权全部是我们用户自己。

上面的示例中基本实现了隔离,具体的播放器跟具体的媒体隔离了,具体的播放器只跟媒体接口和播放器接口有关。但是PlayMedia的方法里面的具体对象,写死了,控制权非常小,如果我想用百度影音播放呢,我想换一首音乐呢,只能重新改代码,那控制怎么进行转移呢?

我们可以通过反射来创建,把具体的文件名写在配置文件里,这时候客户端代码也不用变了,只需要改配置文件就好了,稳定性又有了提高,如下:

public void PlayMedia() {IMediaFile _mtype = Assembly.Load(ConfigurationManager.AppSettings["AssemName"]).CreateInstance(ConfigurationManager.AppSettings["MediaName"]);IPlayer _player = Assembly.Load(ConfigurationManager.AppSettings["AssemName"]).CreateInstance(ConfigurationManager.AppSettings["PlayerName"]);_player.Play(_mtype);}


 

这个具对象是哪一个,全由配置文件来控制了,这个具体对象的控制权交给了配置文件了,这也是人们常说的控制反转。

控制反转IoC是Inversion of Control的缩写,是说对象的控制权进行转移,转移到第三方,比如转移交给了IoC容器,它就是一个创建工厂,你要什么对象,它就给你什么对象,有了IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

3楼shijie_nanjing58分钟前
写的蛮好的,通俗易懂,感谢
2楼eva_5201小时前
很好啊 对我帮助很大
1楼sniffer123452小时前
写得很不错 赞一个

热点排行