Spring 学习系列-----(二)IoC思想

IoC(Inversion of Control),控制反转是Spring框架的核心。常常,我们使用另一个词也可以表示这个意思:Dependency Injection(DI,依赖注入)。
       一切来源于耦合,我们知道,稍微复杂的应用都需要多个对象来完成,这些对象需要相互合作来完成任务,在合作中,就会形成一种耦合关系,实际上就是说明对象之间的依赖性。耦合是一把双刃剑,高耦合的代码将会面临在测试、复用以及可读性方面的缺陷,并且容易引起“whack-a-mole”Bug(即,修复一个Bug,引起更多的Bug)。但是,没有耦合的代码什么都做不了。一般,软件要求高内聚,低耦合。高内聚是指一个模块内元素彼此结合的紧密程度高,即,单一责任原则。低耦合是说不同模块之间互相依赖的关系小,即,模块与模块之间,尽可能使其独立存在。
       耦合实际上是解决一个依赖的问题,如果不用IoC,那么每一个对象都要负责去配置好自己依赖的对象。这里,引用《Spring in Action》里面的例子来说明。现在我们要实现一个骑士类Knight,实际上他是亚瑟王的圆桌骑士KnightOfTheRoundTable,骑士们可以承接一些任务(Quest),而亚瑟王的圆桌骑士要承接的是寻找寻找圣杯的任务(HolyGrailQuest)。
那么我们将写下类似如下的代码:

class KnightOfTheRoundTable{

      private String knightName ;

      private HolyGrailQuest holyGrailQuest ;


      public KnightOfTheRoundTable(String name){

            this . knightName = name;

            holyGrailQuest = new HolyGrailQuest();

      }


      public HolyGrailQuest embarkOnQuest() throws GrailNotFoundException {

            return holyGrailQuest .embark();

      }

}


class HolyGrailQuest{

      public HolyGrailQuest() {}


      public HolyGrailQuest embark() throws GrailNotFoundException {

            HolyGrailQuest grail = null ;

            // Look for grail

            return grail;

      }

}

      一个KnightOfTheRoundTable要去依赖一个 HolyGrailQuest,它要自己在构造的时候new一个 HolyGrailQuest任务。这在单元测试的时候会出一些问题,当你对 KnightOfTheRoundTable做测试的时候,你发现你同时还要去分析 HolyGrailQuest,因为对于embarkOnQuest这个方法,你要知道holyGrailQuest的行为模式。这就是耦合带来的麻烦,难以测试,难以复用。


通常使用接口的方式来解决耦合问题。

interface Quest{}

     

public class HolyGrailQuest implements Quest {

     public HolyGrailQuest() {}

     public Object embark () throws QuestException {

          // Do whatever it means to embark on a quest

          return new HolyGrail();

     }

}


interface Knight{}


public class KnightOfTheRoundTable implements Knight {

     private Quest quest;

         

     public KnightOfTheRoundTable(String name) {

          quest = new HolyGrailQuest();

         

     }

     public Object embarkOnQuest() throws QuestException {

          return quest.embark();

     }

}


这时,控制仍然没有反转,还是需要骑士自己去构造任务。

这就造成在测试时,你仍然不能自己构造模拟任务来让骑士去完成,骑士还是会自己去构造HolyGrailQuest。


这就是一个逻辑问题,到底责任应该给谁更好,骑士应该自己去创造任务,还是让其他人来给骑士分配任务。当然,后者更好一些,因为使用后者,其他人可以给骑士分配任务,这可以是一个圣杯任务,或者一个模拟任务,或者其他。而,骑士也可以专注于自己的事情了。

这就是控制反转的思想,IoC看起来很复杂,其实还好,它实际上就是对于责任(对象联系依赖的责任)的一种反转,将协调依赖对象间合作的责任人从对象自身转移出来。

public class KnightOfTheRoundTable implements Knight {

       private Quest quest;

             

       public KnightOfTheRoundTable(String name) {

             

       }

       public HolyGrail embarkOnQuest() throws QuestException {

             

              return quest.embark();

       }

       public void setQuest(Quest quest) {

              this .quest = quest;

       }

}


Spring :

Wiring:装配,是指在应用组件间建立联系的动作。Spring有很多装配方式

Spring有很多种装配方式来装配beans,其中最常用的就是XML,使用Xml来配置beans,然后装载xml文件,装配对应的beans,对于Spring中的LoC方法,我们将会在下一篇进行介绍。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值