zoukankan      html  css  js  c++  java
  • Spring IoC

    Spring IoC概述

         springIoc(控制反转)是一个比较抽象的概念,

      比如:在实际生活中,我们想喝杯橙汁,在没有饮品店的日子里,最直观的做法就是,要买榨汁机、橙子、水。这里就是自己主动创造的过程,也就是一杯橙汁需要主动创造。

      然而到了今时今日,由于饮品店的盛行,已经没有必要自己去榨橙汁了。想喝橙汁的第一想法就是找到饮品店的联系方式(美团或者饿了么),然后描述你的需要、地址、电话等,下单等待,过会就会有人送上橙汁。这里你并没有主动创造橙汁,也就是橙汁是由饮品店创造的,而不是你,但是也完全达到了你的要求。

      为了更好的阐述抽象描述,我用java代码的形式模拟主动创建和被动创建的过程。

      如果需要橙汁,那么相当于需要橙子、开水、糖等 原料,还有榨汁机这个工具,那我们则创建对应的对象——JuiceMaker 和 Blender 

      主动创建对象

    /***榨汁机***/
    public class Blender {
        public String mix(String water , String fruit , String sugar){
            String juice = "这是一杯由液体" + water +"
     水果:" + fruit +
                    "
    糖量" +sugar + "
    组成的果汁";
            return juice;
        }
    }
    
    /***果汁生成器***/
    public class JuiceMaker {
        private Blender blender = null;
        private String water;
        private String fruit;
        private String sugar;
    
    /***set、get方法***/
    
       public String makeJuice(){
            blender = new Blender();
            return blender.mix(water , fruit ,sugar);
        }
    }

      主动创造橙汁,需要我们实行自己可能不太熟悉的工作——如何搅拌橙汁,比如这里的 mix 方法,显然不是个好方法,而对象果汁(juice) 是需要依赖于水 (water)、水果(fruit)、糖(sugar)和 榨汁机(blender)去实现的。

      被动创建对象

      假设已经提供了榨汁机(JuiceMaker2),那么只需要对其进行描述就能得到果汁了。假设饮品店给我们提供了这样的描述(Source)

      

    public class JuiceMaker2 {
    
        private String beverageShop = null;
        private Source source = null;
    
        /***get、set 方法***/    
      
        public String makeJuice(){
            String juice = "这是一杯" + beverageShop + "饮品店,提供" +
                    source.getSize() + source.getSugar() +source.getFruit();
            return  juice;
        }
    }
    
    public class Source {
        private String fruit; //类型
        private String sugar;//糖分
        private String size;//大小杯
    
    /***get、set 方法***/ 
    
    }

      显然我们并不需要去关注果汁是如何被制造出来的,系统采用XML对这个清单进行描述

    <bean id="source" class="com.todo.pojo.Source">
            <property name="fruit" value="橙汁"/>
            <property name="sugar" value="少糖"/>
            <property name="size" value="大杯"/>
    </bean>

      这里对果汁进行描述,接着需要选择饮品店 

        <bean id="juiceMaker2" class="com.todo.pojo.JuiceMaker2">
            <property name="beverageShop" value="贡茶"/>
            <property name="source" ref="source"/>
        </bean>

      将饮品店设置为贡茶,这样就指定了贡茶为我们提供服务,而订单则引用我们之前的定义,然后使用下面代码就能得到一杯果汁了

    public static void main(String[] args) {
           ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/spring-cfg.xml");
    
           JuiceMaker2 juiceMaker2 = (JuiceMaker2) ctx.getBean("juiceMaker2");
    
            System.out.println(juiceMaker2.makeJuice());
            
        }

      这个过程中,果汁是由贡茶所制造,我们并不用关心制造的过程,我们所需要关心的是如何对果汁进行描述,选择去哪个店制造,就能够得到我们想到的结果,程序也是一样。

  • 相关阅读:
    python之集合(set)
    python之字典
    python之列表
    随笔
    JS实现颜色值格式转换 rgb和十六进制的转换
    20211025一周的计划
    密码肯定没错,但是你死活登录不了,登录页面检查密码格式不对,无法执行登录的一种解决方法
    安卓mbn文件丢失,无法搜索移动信号,工程模式mbn乱改,不用QPST烧录怎样恢复?超简单!
    安装Linux Deploy和Termux之后,再安装ftp服务软件都是多余的!
    “500 oops socket” Debian 9 running via Linux Deploy上成功部署vsftpd的解决方案(201901原创)【成功完美简单极致】
  • 原文地址:https://www.cnblogs.com/guapishuo/p/10130268.html
Copyright © 2011-2022 走看看