IoC,Inverse of Control,控制反转。
仅仅只看名字好像不能理解它的含义,那我们来看它的另一个名词:依赖注入
名字就好理解一些了,即某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,不是传统的由调用者***主动***去创建被依赖对象,而是***被动***的接受Spring容器为调用者的成员变量赋值即可。
由此可见,依赖注入是一种优秀的解耦方式,它可以让Bean以配置文件组织在一起,而不是以硬编码的方式耦合在一起。
这样,我们大致就能理解Ioc的思想了。
控制反转,反转的是程序主动权,将对程序的控制从程序员手上,给到了用户。用户可以通过自己的需求来要求程序的对应功能,从而实现组件之间的解耦
下面来看一段示例代码:
private UserDao userdao = new UserDaoA();
在这个事例中,我们在业务层通过new新建了一个UserDaoA的对象,这样我们就可以通过userdao调用UserDaoA的方法。
但,如果用户需求改变,现在需要UserDaoB的方法了呢?
朴素的思想告诉我们,只要修改业务层的代码,将userdao对象的类型修改为UserDaoB即可。当然,这是一个可行的办法,在简单的程序中,这种方案清晰简易,但更复杂一些呢,应用场景要求的不同类更多些呢,难道所有的更改都需要程序猿累死累活的一一改动吗,这无疑是一项大工程了。
下面是IoC思想下设值注入的代码:
private UserDao userdao;
//使用set注入,让用户决定使用哪一个UserDao
public void setUserDao(UserDao ud){
this.userdao = ud;
}
乍一看这个例子,创建一个userdao对象还需要写一个set方法,貌似更复杂了,但实际上,在复杂的应用环境中,这样的方案无需程序员再维护这个userdao的类型,只需用户DIY即可。
如果当前需要的是UserDaoC、UserDaoD,同样只需要通过注入的值的类型去调用对应不同的方法即可。



