• 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());
        }
    }

     PS:第2部分的代码不写也能实现bean的注入,因为在XML中已经进行了bean的配置并通过ref属性将source注入到juiceMaker中去了。

  • 相关阅读:
    crazyflie2.0 RCC时钟知识
    quick-cocos2d-x开发工具sublime text及其强力插件QuickXDev
    [Swift通天遁地]一、超级工具-(16)使用JTAppleCalendar制作美观的日历
    [Swift]LeetCode186. 翻转字符串中的单词 II $ Reverse Words in a String II
    [SQL]LeetCode185. 部门工资前三高的员工 | Department Top Three Salaries
    [Swift通天遁地]一、超级工具-(15)使用SCLAlertView制作强大的Alert警告窗口和Input编辑窗口
    [SQL]LeetCode184. 部门工资最高的员工 | Department Highest Salary
    [Swift通天遁地]一、超级工具-(14)使用SweetAlert制作漂亮的自定义Alert窗口
    [Swift]关键字:Self、self与super
    [Swift]LeetCode964. 表示数字的最少运算符 | Least Operators to Express Number
  • 原文地址:https://www.cnblogs.com/riches/p/11491874.html
Copyright © 2020-2023  润新知