spring:控制反转

一、 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值