IOC(Inversion of Control):控制反转。
*其他解释:依赖注入、依赖反转……
设计目标:简化JEE的研发工作,提供IOC容器,控制bean的生成、注入,解耦。
看了网上的一些帖子、介绍,书籍中的一些剖析,都不是很了解IOC这个概念,于是找来这么段代码,直接从代码上去理解了。
interface A{ }
public class B implements A { }
正常情况下,我们要使用到A接口的实现都是这样:
A a = new B();
但在IOC实现Spring中则是这样:
@Autowired
public A a;
也就是说,当你要应用不同的实现类的时候,你只需要去配置xml文件,或者修改@service的bean对象,如:
把
@Service
public class B implements A { }
改成
@Service
public class C implements A { }
而不需要这样子修改:
A a = new C();
这里不去探讨Spring是如何实现的,具体涉及到的反射相关名词,如有兴趣,自行学习。
我们只谈论这样子的好处,经常进行Ajax编程的人,或许对这样子的代码并不陌生:
$.post(url, function(data){
//
});
这里用到的是回调的设计模式,在java中这样的回调通常会与接口挂钩,即传进去的是一个接口实现类(因为java中的函数实现必须要挂载在对象上,而不像脚本语言可以进行函数式编程),所以前端代码中传递的就仅仅是一个匿名函数了,这样的好处就是当你实际运行的时候才去确定你所需要绑定的方法,而非耦合度高的编译时绑定或者硬编码。
实际上这对于Java这种强类型的接口编程语言是相当合适的,至少笔者认为这样可以指导初学者的编程,举个例子,在swing编程中的事件监听你只需要传一个接口实现类(里面对应的方法需要实现)进去即可,而不需要去编写相当复杂的代码逻辑,即把业务逻辑部分的代码抽离出来,让研发人员可以专注在业务逻辑的实现上。Spring很大程度上的一个设计目标就是如此。