首页 > 其他 > 详细

理解Spring框架的控制反转——学习笔记

时间:2014-02-28 12:12:21      阅读:473      评论:0      收藏:0      [点我收藏+]

刚才写完了随笔,要保存的时候突然就没了...只好再做一次笔记,算是加深印象吧...

  开始学习Spring框架,以前虽然也在视频上接触过一点Spring的内容,但是学得都是老师直接告诉我们该怎么怎么配置,这个bean有什么用之类的。现在想自己看看书,从头理解这个框架的用法,还有概念。

  之前一直不理解IoC(控制反转)和DI(依赖注入)的含义。原来IoC是一个通用的设计原则,用于解耦组件之间的依赖关系。而DI则是具体的设计模式,是IoC的一个典型实现,怪不得之前看的资料上说IoC和DI可以理解为同一个东西...虽然这个说法不太对,但是还是能给人加深一些记忆的。

  理解IoC概念的同时,就得看看Spring框架的IoC容器,了解它是怎么实现对组件的解耦的,了解它是如何“依赖注入“的。为了引出的容器的概念,可以看一个很简单例子:两个类(Apple类和Pear类)实现了同一个接口(Fruit接口),它们中都只有一个toTranslate方法(分别输出”我是苹果“和”我是梨子“),现在写一个FruitService类,代码如下:

bubuko.com,布布扣
public class FruitService {
    private Fruit fruit;
    
    public void setFruit(Fruit fruit) {
        this.fruit = fruit;
    }

    public void mySaid(){
          System.out.println(fruit.toTranslate()+",我很好吃”);
    }
}    
bubuko.com,布布扣

于是,在测试类(即Main)里,我需要实例化FruitService,Apple,Pear三个类,并把Apple或Pear   setter进FruitService里,最后调用方法才能获得想要的内容(“我是苹果,我很好吃”或者“我是梨子,我很好吃”),代码如下:

bubuko.com,布布扣
public class Test {
    
    public static void main(String[] args) {
        Apple apple=new Apple();
        Pear pear=new Pear();
        FruitService service=new FruitService();
        service.setFruit(apple);
        service.mySaid();
    }
}    
bubuko.com,布布扣

很明显,这样需要我们亲自实例化Apple,Pear等方法,还要亲自将Apple类的实例注入到FruitService中。并且这样的代码耦合度高,从依赖性的角度就可以发现,Apple和Pear依赖Fruit接口,FruitService类依赖Apple,Pear和Fruit。这样不利于代码的维护。

所以可以想象为什么需要一个Ioc容器。因为容器可以管理组件,这意味着实例化类和注入可以由容器完成,而我们只需要把相应的组件放在容器里就可以了。可以写一个简单的与springIoC容器概念相似的Container类。(因为是简单的实现,所以用Map来存放组件,假装像在配置文件里配置的效果)代码如下:

bubuko.com,布布扣
public class Container {
    private Map<String,Object> components;//用于存放组件
    
    public Container(){
        Apple apple=new Apple();
        components.put("apple",apple);

        FruitService service=new FruitService();
        service.setFruit(apple);
        components.put("service",service);
    }

    public Object getComponents(String id){
        return components.get(id);//用于获取组件
    }
}
bubuko.com,布布扣

接下来再看看测试类:

bubuko.com,布布扣
public class Test {
    
    public static void main(String[] args) {
        Container container=new Container();
        FruitService service=container.getComponents("apple");
        service.mySaid();
    }
}
bubuko.com,布布扣

这时候就会输出”我是苹果,我很好吃”了。由上面测试类也可以看出,为什么使用Spring IoC容器时都要先实例化该容器,道理也是一样的。依赖注入则是和上面例子中容器类的setter概念相似,即容器帮你把需要的对象进行了setter。形象化的说法就是,你不必自己去找食物,已经有人把食物塞到你手里了,这个人就是IoC容器。

 

理解Spring框架的控制反转笔记结束。

理解Spring框架的控制反转——学习笔记,布布扣,bubuko.com

理解Spring框架的控制反转——学习笔记

原文:http://www.cnblogs.com/czhfuture/p/3572334.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!