Spring学习笔记:Spring IoC容器简述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/sinat_38393872/article/details/95076976

这片文章是对自己学习的总结,学习材料是Java EE互联网轻量级框架整合开发 SSM框架(Spring MVC + Spring + Mybatis)和Redis实现。作者是杨开振,周吉文,梁华辉和谭茂华。

Spring IoC是一种容器,举个例子。以前没有奶茶点时,没有人卖果汁。如果我们想喝果汁,那么就应该做买水果,打开榨汁机,榨水果(上面三步看成是创建类的对象),得到一被果汁(得到类的对象)。现在有了奶茶店,那么我们要做的不是自己去榨果汁,而是找到奶茶店的联系方式,然后打电话,之后得到一杯果汁(得到类的对象)。可以发现,这个方法中我们并没有真正地去“主动”制作果汁,真正制作果汁的是奶茶店。但这也可以达到我们的需求。

以上就是Spring IoC的思想。如果制作果汁是一个很复杂的过程,我们的目的只是想要一杯果汁,Spring IoC就很有用。现实中开发团队由很多开发者组成,如果团队负责的事电商网站开发工作,你熟悉商品交易流程,但是对财务处理一窍不通,而商品交易又必须设计到财务处理。这时候,你的期望就应该是

  1. 熟悉财务处理的同伴开发对应的接口。
  2. 接口逻辑尽可能简单,自己不需要了解复杂的内部逻辑,只需要简单的调用就能使用。
  3. 通过简单的描述就能得到这个接口的实例,描述也尽可能简单。

以上可以看出,财务接口的实例并不是由你创建的,但是你确实获得了这个实例————相当于是你自己创建的实例。你把创建对象的主动权交给了别人,简化了自己的工作。下面用代码来描述这个过程。

//这个类是搅拌机,我们自己做果汁就要用到这个类
public class Blender{
    //制造果汁的过程mix
    Public String mix(String water, String fruit, String sugar){
        String juice = water + fruit + sugar;
        return juice;
    }
}

//我们主动制造果汁,所以要自己准备water, fruit, sugar。
public class JuiceMaker{
    private Blender blender = null;
    private String water;
    private String fruit;
    private String sugar;
    //使用搅拌机制造果汁
    public String makeJuice(){
        blender = new Blender();
        return blender.mix(water, fruit, sugar);
    }
}

这段代码是我们主动制造果汁。自己做果汁需要搅拌机,所以有一个类描述搅拌机。最后用JuiceMaker描述自己,使用makeJuice方法得到果汁。这里不是一个好方法,我们得到果汁(对象)需要依赖太多的东西,如下图所示,而且制作果汁mix()是一个很复杂的函数的话就让代码看起来很麻烦。

使用Spring IoC的话就不会这样,我们不主动创造对象,而是被动创造。

package com.luckincoffee.Ioc
publc class JuiceMaker{
    //奶茶店类,里面有制作果汁的方法mix,但我们不需要知道实现的具体细节。
    private BeverageShop beverageShop = null;
    //Source类记录着对果汁的描述
    private Source source = null;
    /**** setter and getter ****/
    public String makeJuice(){
        String juice = beverageShop.mix() + source.getSize() + source.getSuger() + source.getFruit();
        return juice;
    }
}
    
package com.luckincoffee.Ioc
public class Source{
    private String fruit;
    private String sugar;
    private Integer size;
    /**** setter and getter ****/
}

显然,上面的代码我们不需要知道果汁的制作过程。makeJuice函数只是需要奶茶店名,饮料名,半塘或全塘,中杯或大杯这样简单的描述信息我们就可以得到一杯果汁。在Spring中,我们可以把一个类的描述信息装入Spring IoC中,这个描述信息可以用XML描述出来。

<bean id = "source" class = "com.luckincoffee.ioc.Source">
    <property name = "fruit" value = "橙汁"/>
    <property name = "suger" value = "半塘"/>
    <property name = "size" vlaue = "大杯"/>
</bean>

同时,选择奶茶店的描述也可以使用XML来描述。因为这些信息不在同一个类中,所以要两个bean来描述。

<bean id = "juiceMaker" class = "com.luckincoffee.ioc">
    <property name = "beverageShop" value = "瑞幸咖啡">
    <property name = "source" ref = "source"/>
</bean>

将上面的两个实例当成bean装入Spring IoC中,我们就可以只根据bean的id得到果汁的实例,代码如下。

//这句是生成Spring IoC容器的语句,不用太在意细节。
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-cfg.xml");
//通过之前xml中定义好的id得到对应的实例
JuiceMaker juiceMaker = (JuiceMaker) ctx.getBean("juiceMaker");
/*下面是得到果汁对象的代码,因为是通过getBean得到的对象(实际上是反射得到对象),
所以类型是Object,需要将类型强制转换一下。其中对奶茶的描述信息也被记录在对象juiceMaker之中。
这里描述和得到对象的代码是分离的,以后想要其它的奶茶,只需要对XML进行就该就好了*/
String juice = juiceMaker.makeJuice();

所以Spring IoC(控制反转)可以说成是一种通过描述(Java里面通过XML或者注解)将实例对象装入容器中,第三方只要通过id名就能得到特定对象的框架。

但Spring IoC不是一个方法,它其实是一个容器。上面提到熟悉财务的人完成财务的开发,我们通过简单的描述得到财务的接口,相反,我们完成交易的模块,财务的人通过简单的描述得到交易的接口。两方人马是通过完成各自的模块,然后将这些服务传到Spring IoC容器中让别人可以使用。过程如下图所示。

猜你喜欢

转载自blog.csdn.net/sinat_38393872/article/details/95076976