• 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中去了。

  • 相关阅读:
    Collection(集合)知识点总结
    【Mysql 学习】mysql 的使用复习
    解决Address localhost:1099 is already in use
    mysql8.0中dcl语句修改密码的语法
    mysql+sqlyog 多表查询练习
    MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法
    JDBC连接Mysql 8.0.12版本的几个注意事项
    JSTL学习
    64-多个参数个数
    63-参数的使用
  • 原文地址:https://www.cnblogs.com/riches/p/11491874.html
Copyright © 2020-2023  润新知