控制反转(IOC)的一个spring框架很重要的特点,那到底什么是控制反转,控制反转有什么用呢?
什么是控制反转呢?
(百度百科)控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
控制反转,顾名思义应该就是控制关系的反转。例如一司机H,一女明星L,一演艺公司K。原本的控制关系是L依赖H,就是L控制司机,控制反转后就是,演艺公司安排司机给女明星,那么相当于司机选择女明星,这样控制关系就反转了。
那么控制反转有什么优势呢?
假如演艺公司K有100个演员,都要求司机H作为他们的司机(假如H是劳模),但是有一天司机H生病了,要换一个司机。
这时有好问的同学就开始发问了,说“换司机有什么问题吗?”好的,请看下面的代码:
class DriverH {
public void dosomething() {
.....
}
}
class DriverW {
public void dosomething() {
.....
}
}
.....
class ActorL{
private String name;
public void doSomething(){
new DriverH().dosomething();
}
}
class ActorP{
private String name;
public void doSomething(){
new DriverH().dosomething();
}
}
.....
如果演员们要司机W,需要修改在每个演员类里面修改,那至少要修改代码100处不是吗?这样显得太麻烦了。
如果利用了控制反转呢?且看代码:
class DriverH {
public void dosomething() {
.....
}
}
class DriverW {
public void dosomething() {
.....
}
}
.....
class ActorL{
private String name;
....
public void doSomething(){
context.getBean("Driver").dosomething();
}
}
class ActorP{
private String name;
...
public void doSomething(){
context.getBean("Driver").dosomething();
}
}
.....
这时换司机类就只需要在xml配置文件中修改<bean name="Driver" ref="..."></bean>
一处就好。
后语
眼看就到文章的结尾了,这时必定有一个言辞激烈、善于唱、跳、rap、篮球的键盘侠开始向我发难了,立即post上他的代码,来质疑spring的必要性,认为用java源码就可以轻松实现上面的功能:
class Driver{
}
class DriverH extends Driver{
public void dosomething() {
.....
}
}
class DriverW extends Driver{
public void dosomething() {
.....
}
}
.....
class Drivers{
public static Driver getDriver(){
return new DriverX();//此处X表示某一个司机
}
}
class ActorL{
private String name;
....
public void doSomething(){
Drivers.getDriver().dosomething();
}
}
class ActorP{
private String name;
...
public void doSomething(){
Drivers.getDriver().dosomething();
}
}
.....
引用雷军的一句雷言雷句:
你他妈是来砸场子的事吧
杠精
杠精
杠精
当然能够用java来实现上面的功能,因为spring本身就是用java来实现的,而且spring的特点又不止ioc这一个,spring的源码也非常优秀,效率很高。