Spring学习(二)Spring IoC 和 DI 简介

一、IOC(控制反转)

定义:反转控制 (Inversion Of Control)的缩写,创建对象的反转控制

正向控制:若要使用某个对象,需要自己去负责对象的创建。

反向控制:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。

例子:在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。

值得注意的是:这些都是你自己“主动”创造的过程,也就是说一杯橙汁需要你自己创造。

然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。

值得注意的是:你并没有“主动”去创造橙汁,橙汁是由饮品店创造的,而不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。

代码示例:(这里使用的是Spring4.3.0版本的jar包)

pojo

/**
 * 这是一个模拟果汁模型的pojo
 */
public class Source implements Serializable {
    private String fruit;   // 类型
    private String sugar;   // 糖分描述
    private String size;    // 大小杯

    /*getter和setter方法暂时省略*/  
} 

Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="source" class="pojo.Source">
        <property name="fruit" value="橙子"/>
        <property name="sugar" value="多糖"/>
        <property name="size" value="超大杯"/>
    </bean>
</beans>

测试类

public class TestSpring {

    @Test
    public void test() {
        //1、使用ApplicationContext类读取xml配置文件生成bean工厂(bean工厂为了控制反转时获取对象用)
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[]{"applicationContext.xml"}
        );

        //2、实例化bean(这里实例化的bean是从bean工厂里面获取的,与传统自己new一个对象的方式不同,实现控制反转)
        Source source = (Source) context.getBean("source");
        System.out.println(source.getFruit());
        System.out.println(source.getSugar());
        System.out.println(source.getSize());
    }
}

 

 二、DI(依赖注入)

定义:指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。

实现原理:

① 读取标注或者配置文件,看看JuiceMaker依赖的是哪个Source,拿到类名

 使用反射的API,基于类名实例化对应的对象实例

③ 将对象实例,通过构造函数或者 setter,传递给 JuiceMaker

代码示例:(这里使用的是Spring4.3.0版本的jar包)

 

pojo

/**
 * 设置一个果汁制造者
 */
public class JuiceMaker {

    // 唯一关联了一个 Source 对象
    private Source source;

    /* setter and getter */

    public String makeJuice() {
        String juice = "xxx用户点了一杯" + source.getFruit() + source.getSugar() + source.getSize();
        return juice;
    }

    public Source getSource() {
        return source;
    }

    public void setSource(Source source) {
        this.source = source;
    }
}

Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置一个名叫source的bean-->
    <bean name="source" class="pojo.Source">
        <property name="fruit" value="橙子"/>
        <property name="sugar" value="多糖"/>
        <property name="size" value="超大杯"/>
    </bean>

    <!--配置一个名叫juickMaker的bean,把上面配置的名为source的bean通过ref属性注入到这个bean内-->
    <bean name="juiceMaker" class="pojo.JuiceMaker">
        <property name="source" ref="source" />
    </bean>
</beans>

测试类

public class TestSpring {

    @Test
    public void test() {
        //1、使用ApplicationContext类读取xml配置文件生成bean工厂(bean工厂为了控制反转时获取对象用)
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[]{"applicationContext.xml"}
        );

        //2、实例化bean(这里实例化的bean是从bean工厂里面获取的,与传统自己new一个对象的方式不同,实现控制反转)
        Source source = (Source) context.getBean("source");
        System.out.println(source.getFruit());
        System.out.println(source.getSugar());
        System.out.println(source.getSize());

        //3、实例化一个名叫juiceMaker的bean,此bean内注入上面的source
        JuiceMaker juiceMaker = (JuiceMaker) context.getBean("juiceMaker");
        System.out.println(juiceMaker.makeJuice());
    }
}

 

猜你喜欢

转载自www.cnblogs.com/riches/p/11491874.html
今日推荐