一、 ioc的思想
ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。第一,资源集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。
也就是说,甲方要达成某种目的不需要直接依赖乙方,它只需要达到的目的告诉第三方机构就可以了,比如甲方需要一双袜子,而乙方它卖一双袜子,它要把袜子卖出去,并不需要自己去直接找到一个卖家来完成袜子的卖出。它也只需要找第三方,告诉别人我要卖一双袜子。这下好了,甲乙双方进行交易活动,都不需要自己直接去找卖家,相当于程序内部开放接口,卖家由第三方作为参数传入。甲乙互相不依赖,而且只有在进行交易活动的时候,甲才和乙产生联系。反之亦然。这样做什么好处么呢,甲乙可以在对方不真实存在的情况下独立存在,而且保证不交易时候无联系,想交易的时候可以很容易的产生联系。甲乙交易活动不需要双方见面,避免了双方的互不信任造成交易失败的问题。因为交易由第三方来负责联系,而且甲乙都认为第三方可靠。那么交易就能很可靠很灵活的产生和进行了。
这就是ioc的核心思想。生活中这种例子比比皆是,支付宝在整个淘宝体系里就是庞大的ioc容器,交易双方之外的第三方,提供可靠性可依赖可灵活变更交易方的资源管理中心。另外人事代理也是,雇佣机构和个人之外的第三方。嗯,就这样,希望对题主有帮助。
==========================update===========================
在以上的描述中,诞生了两个专业词汇,依赖注入和控制反转
所谓的依赖注入,则是,甲方开放接口,在它需要的时候,能够讲乙方传递进来(注入)
所谓的控制反转,甲乙双方不相互依赖,交易活动的进行不依赖于甲乙任何一方,整个活动的进行由第三方负责管理。
这就是spring IOC的思想所在,不要只谈DI IOC这些概念。
人之所恶在好为人师,不实知,谨慎言。 他人有心,予忖度之.吾之谓也
二、下面是详细例子:
1、UserDao接口
public interface UserDao
{
public void saySome();
}
- 1
- 2
- 3
- 4
2、下面是两个实现
UserDaoImp1 和 UserDaoImp2
//UserDaoImp1
public class UserDaoImp1 implements UserDao
{
public void saySome()
{
system.out.println("i'm User1");
}
}
//UserDaoImp2
public class UserDaoImp2 implements UserDao
{
public void saySome()
{
system.out.println("i'm User2");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3、下面是业务逻辑service
//UserService
public class UserService
{
public UserDao userDao;
public void SetUserDao(UserDao userDao)
{
this.userDao=userDao;
}
public UserDao GetUserDao()
{
return userDao;
}
//普通方法
public void Show()
{
userDao.saySome();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
4、在main中调用
public class MainProgram
{
public static void main(string[] args)
{
UserService userService=new UserService();
//如果配置文件中配置了user1,就输出i'm user1。否则输出i'm user2
userService.Show();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
5、下面是配置文件
<bean id="UserDaoImp1" class="com.test.UserDaoImp1">
</bean>
<bean id="UserDaoImp2" class="com.test.UserDaoImp2">
</bean>
<bean id="UserService" class="com.test.UserService">
<property name="userDao">
<ref local="UserDaoImp1"/>
</property>
</bean>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
以上代码体现出了控制反转的好处:
如果想调用UserDaoImp2,就在配置文件中修改配置即可,很方便;
如果没有用控制反转:
那么UserDao就是在service中直接实例化,如下:
//UserService
public class UserService
{
//此时如果想调用UserDaoImp2,只能在此处修改代码,明显没有直接在配置文件中改着方便
public UserDao userDao=new UserDaoImp1();
//普通方法
public void Show()
{
userDao.saySome();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11