首页 > 代码库 > Spring中的IOC
Spring中的IOC
在学习spring的时候,最常听到的词应该就是IOC和AOP了,下面,我从我的角度再次理解一下Spring里的IOC和AOP.
IOC简介
IoC(InversionofControl):IoC就是应用本身不依赖对象的创建和维护而是交给外部容器(这里为spring),这要就把应用和对象之间解耦,控制权交给了外部容器。即Don‘tcallme,I‘llcallyou!所以IoC也称DI(依赖注入)对象的创建和维护依赖于外部容器.
IOC详解
关于IOC的博客有很多,我们可以从这篇博客中了解一下:
深入浅出Spring(二)IoC详解
简单理解IOC
我们从文章中发现,其实ioc所做的一件事情就是把A和B的强耦合关系,变成A依赖于B的接口的关系,但具体A要实现B接口中哪一种B类型,由C来决定,以达到解耦,通俗来讲,我们在家到饭点的时候就会说“我要吃饭”,我这里代表的是A,饭代表的是B的接口,但是具体是要吃什么饭,那就由你的妈妈在决定,你妈妈给你在碗里放了米饭(B),你就要吃米饭,当然,今天你妈妈开心,也可以给你碗里放一个鸡腿,这个决定权在你的妈妈,也就是我们常说的把控制权交给第三方。一次来达到我(A)和米饭(B)的解耦。
DI与IOC 的关系
我们可能会经常听到另一个词:DI,这里,简单的做一下讲解:
因为IOC确实不够开门见山,因此业界曾进行了广泛的讨论,最终软件界的泰斗级人物MartinFowIer提出了DI(依注入:Dependency Injection)的概念用以代替loc,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。“依賴注入”这个名词显然比“控制反转”直接明了、易于理解。
所以,我认为IOC和DI描述的是一件事情,只是从不同的角度来描述:
IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际上就是我们现在说的第三方,侧重于原理。
DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。
说到DI,可能就会有出现这样一个问题,既然DI侧重实现,那么他是怎么实现的呢?也就是怎么注入的呢?下面我们
几种注入方式:
简单说一下几种注入方式:
第一种:构造函数注入(这里我们直接沿用上面的例子):
publicclass Team { privateLeader leader; publicTeam(Leader leader){ this.leader=leader; } public void firstMetting(){ leader.introduce(); } } 在Boss出的代码为: public class Boss { public void direct(){ Leader leader = new Li(); Team team = new Team(leader); team.firstMetting(); }
第二种:属性注入:
有时,我们会发现,虽然小李在这个team里要发言,,但并非每次都要发言,在这种情况下通过构造函数注入并不妥当,这时可以考虑使用属性注入。属性注入可以有选择地通过setter方法完成调用类所需依赖的注入,更加灵活方便;
public class Team { privateLeader leader; publicvoid SetLeader (Leader leader){ this.leader=leader; } public void firstMetting(){ leader.introduce(); } } 在Boss出的代码为: public class Boss { public void direct(){ Leader leader = new Li(); Team team = new Team(); Team.setLeader(leader); team.firstMetting(); }
和通过构造函数注入不同,在实例化Team时,并未指定任何发言人,而是在实例化Team后,在需要小李出场时,才调用其setLeader方法注入扮演者。按照类似的方式,这样,我们就可以在不同的场合,注入相应的发言人了。
第三种:接口注入:
定义接口: Public interface teamInject{ voidinjectLeader(Leader leader); } public class Team implements teamInject { privateLeader leader; publicvoid injectLeader (Leader leader){ this.leader=leader; } public void firstMetting(){ leader.introduce(); } } 在Boss出的代码为: public class Boss { public void direct(){ Leader leader = new Li(); Team team = new Team(); Team.setLeader(leader); team.firstMetting(); }
由于通过接口注入需要额外声明一个接口,增加了类的数目,而且它的效果和属性注
入并无本质区别,因此我们不提倡采用这种方式。
Spring中实现IOC
当然,在这个例子中,我们是通过手动维护第三方类的,那么,Spring容器是怎么实现的呢?
spring容器实现的方法网上也有很多,在这里,我就直接站在巨人的肩膀上了:
手动模拟IOC
其实,在Spring容器中,容器只是把第三方这个类对外封装成一个xml节点,在容器中进行查询注入,注意,这里用到两个非常重要的技术,一个是查找XML,另一个是根据方法名利用反射机制调用类。我感觉如果以后想写出好的程序,这两个技术是必不可少的。
IOC就讲到这里,下面讲一下我对AOP的理解:Spring中的AOP