Spring核心容器IOC案例讲解,带你理解IOC

Universe Infinity inc.

什么是IOC容器,先把IOC给忽略到,其实就是个容器。
什么?容器又是个啥玩意?容器是用来放东西的东西啊。
各个领域都喜欢起一些专业术语,显得很高级。给你讲IOC是不是很高级,给你讲Map是不是就明白了。

bean对象最终存储在spring容器中,在spring源码底层就是一个map集合,存储bean的map在DefaultListableBeanFactory类中:
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
Spring容器加载到Bean类时 , 会把这个类的描述信息, 以包名加类名的方式存到beanDefinitionMap 中。
其中 String是Key , 默认是类名首字母小写 ;BeanDefinition , 存的是类的定义(描述信息) , 我们通常叫BeanDefinition接口为 : bean的定义对象。

在Spring的底层,其就是一个Map数据结构。这个Map被大家称为容器,其中存放的是一个个的对象。
那么IOC又是个啥玩意呢?别着急我们一步步来。

1、小明买苹果准备吃(但是牙口不好),小明买把刀切苹果。

  • 苹果和刀都是给好的,没的说。
class Apple {
    String desc = "苹果";
    @Override
    public String toString() {
        return "Apple{desc='" + desc + "'}";
    }
}
class Knife {
    String desc = "水果刀";
    void cut(Object object) {
        System.out.println(this + "切:" + object);
    }
    public String toString() {
        return "Knife{desc='" + desc + "'}";
    }
}
  • 小明要买水果刀吃苹果,这些都要自己去做(这个过程就new)
public class Main {
    @Test
    public void test1() {
        Apple apple = new Apple(); //小明买苹果准备吃(但是牙口不好)
        Knife knife = new Knife(); //小明买把刀
        knife.cut(apple); //小明用刀切苹果
    }
}
  • 输出Knife{desc='水果刀'}切:Apple{desc='苹果'}

2、小明要喝依云山雪水(脑袋进水了吧)。小明要先去买个瓶子,然后乘坐交通工具去依云山,小明在雪山下面等了好久,终于雪化了,灌了一瓶水,高高兴兴回来了。

  • 杯子和水都是给定的,没的说
class Cup {
    String desc = "杯子";
    void load(Object object) {
        System.out.println(this + "装:" + object);
    }
    public String toString() {
        return "Cup{desc='" + desc + "'}";
    }
}
class Water {
    String desc = "依云水";
    @Override
    public String toString() {
        return "Water{desc='" + desc + "'}";
    }
}
  • 小明自己去买杯子,还要坐交通工具去装水
public class Main {
    @Test
    public void test2() {
        Cup cup = new Cup(); //小明要先去买个瓶子
        Water water = new Water();//然后乘坐交通工具去依云山,小明在雪山下面等了好久,终于雪化了
        cup.load(water); //灌了一瓶水,高高兴兴回来了
    }
}

  • 输出Cup{desc='杯子'}装:Water{desc='依云水'}

3、小明吃完苹果,看到快过期的依云水,叹了一口气,用依云水冲洗了刀。

  • 整体过程
@Test
public void test3() {
    Cup cup = new Cup(); //小明要先去买个瓶子
    Water water = new Water();//然后乘坐交通工具去依云山,小明在雪山下面等了好久,终于雪化了
    cup.load(water); //灌了一瓶水,高高兴兴回来了
    
    Apple apple = new Apple(); //小明买苹果准备吃(但是牙口不好)
    Knife knife = new Knife(); //小明买把刀
    knife.cut(apple); //小明用刀切苹果
    
    wash(knife, water);//依云水冲洗刀
}
static void wash(Object target, Object source) {
    System.out.println(source + "冲洗:" + target);
}

  • 输出Water{desc='依云水'}冲洗:Knife{desc='水果刀'}

4、来回跑来跑去,小明累坏了,小明找到了我们

我对小明说,我给你做个空间戒指,把上面的刀、水果、瓶子、水都存好,小明不用去买了(not new),直接从空间戒指中取。

  • 空间戒指定义如下
class Beans {
    private Map<String, Object> beanMap = new HashMap<String, Object>();
    Beans() {
        init();
    }
    Object getBean(String id) { //小明用这种办法获取对应物品
        return this.beanMap.get(id); 
    }
    Map<String, Object> init() { //我们把刀、水果、瓶子、水都放进空间戒指中
        this.beanMap.put("apple", new Apple());
        this.beanMap.put("knife", new Knife());
        this.beanMap.put("water", new Water());
        this.beanMap.put("cup", new Cup());
        return this.beanMap;
    }
}
  • 小明要用戒指了。愉快的吃苹果,愉快的喝依云水。

    有一点要明白。小明是知道空间戒指中有什么内容的,小明也知道空间戒指中的内容可以用来做什么。

//我们把小明需要的东西都给准备好了,小明不用买这买那,跑来跑去了。
public class Main {
    @Test
    public void test4 {
        Beans beans = new Beans();
        Apple apple = (Apple) beans.getBean("apple");
        Knife knife = (Knife) beans.getBean("knife");
        knife.cut(apple);
        Cup cup = (Cup) beans.getBean("cup");
        Water water = (Water) beans.getBean("water");
        cup.load(water);
    }
}

小明终于不用跑来跑去了。

5、小明又过来了,说这个空间戒指不能放东西啊

ε=(´ο`*)))唉,小明是上帝,给他干

  • 市面上的一辆车

    //市面上的一辆车
    class Car {
        String desc = "UUI Car";
        public void driver() {
            System.out.println(desc + "发动了...");
        }
        public String toString() {
            return "Car{desc='" + desc + "'}";
        }
    }
    
  • 给小明准备个记事本,小明要什么在其中写出来。id是小明定的名称,class是小明想要的哪家的车。

    id="car",class="com...Car" //id是小明定的名称,class是小明想要的哪家的车
    
  • 重新造一个空间戒指给小明

    //我们把小明需要的东西都给准备好了,小明不用买这买那,跑来跑去了。
    class Beans {
        private Map<String, Object> beanMap = new HashMap<String, Object>();
        private Map listMap = new HashMap<String, String>();
    
        Beans(String fileName) {
            //从记事本中取出id和class
            this.listMap.put("car", "com...Car");
            init();
        }
        Object getBean(String id){
            return this.beanMap.get(id);
        }
    
        Map<String, Object> init() {
            this.listMap.forEach((k, v) -> {
                Object o = null;
                try {
                    Class<?> aClass = Class.forName((String) v);
                    o = aClass.getDeclaredConstructor().newInstance();
                } catch (Exception e) {
                    System.out.println("error!");
                }
                this.beanMap.put((String) k, o);
            });
            return this.beanMap;
        }
    }
    
  • 小明可以开车啦

    public class Main {
        public static void main(String[] args) {
            Beans beans = new Beans("记事本");
            Car car = (Car) beans.getBean("car");
            System.out.println(car);
            car.driver(); //小明开车
        }
    }
    

6、总结

回到开头,容器是什么呢?就是我们的空间戒指。那么IOC是什么呢?IOC说明白就是不用小明自己去买东西了,容器的东西也不是小明放,而是我们的空间戒指自己去放(开玩笑吧,空间戒指自己去放?emmm先这样理解吧)。
留一个问题,小明不想写记事本了。我们怎么做才能让小明要啥就能从空间戒指中拿出来啥呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值