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

这篇具有很好参考价值的文章主要介绍了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先这样理解吧)。
留一个问题,小明不想写记事本了。我们怎么做才能让小明要啥就能从空间戒指中拿出来啥呢?文章来源地址https://www.toymoban.com/news/detail-820954.html

到了这里,关于Spring核心容器IOC案例讲解,带你理解IOC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023新版Spring6全新讲解-核心内容之IoC

      IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。   Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系

    2024年02月06日
    浏览(85)
  • Spring 6 IOC容器加载过程与核心方法refresh源码浅析

    前言:本篇只对主线核心逻辑进行梳理分析,本篇以AnnotationConfigApplicationContext容器为例进行切入分析【Spring版本为: v6.0.2】 我们启动容器的时候,虽然只是new了一个AnnotationConfigApplicationContext对象,但是在这个过程中spring处理了很多的事情。 创建AnnotationConfigApplicationContext对象

    2023年04月08日
    浏览(50)
  • 一篇文章带你搞懂spring6的概念、spring入门与容器IoC详解(尚硅谷笔记)

    Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring 框架

    2023年04月16日
    浏览(39)
  • 【Spring进阶系列丨第三篇】Spring核心技术之 IoC 与 DI 实战案例

    在上一篇文章中,我们学习了IoC与DI的相关概念与原理,现在让我们 以HelloWorld为例,编写一个程序,让创建对象的工作由Spring帮助我们创建。 一同感受一下Spring框架带给我们开发的便捷性。 这种做法是以前最常用的做法,HelloWorld这个类的对象是我们程序员自己去创建并为属

    2024年02月05日
    浏览(51)
  • spring 容器结构/机制debug分析--Spring 学习的核心内容和几个重要概念--IOC 的开发模式--综合解图

    😀前言 本片文章是spring 容器结构/机制debug分析和几个重要概念以及IOC 的开发模式 🏠个人主页:[尘觉主页](https://blog.csdn.net/apple_67445472?type=blog) 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 在csdn获奖荣誉: 🏆csdn城市之星2名

    2024年02月02日
    浏览(61)
  • 【Spring 核心 | IoC】

      IoC即控制反转(Inversion of Control,缩写为 IoC)。IoC又称为依赖倒置原则(设计模式六大原则之一)。 IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。这样对象的控制权就反转了,你无需关心对象的各种创建,只需关注业务的本身,大大

    2024年02月10日
    浏览(56)
  • Spring 核心概念之一 IoC

    欢迎来到本篇文章!通过上一篇什么是 Spring?为什么学它?的学习,我们知道了 Spring 的基本概念,知道什么是 Spring,以及为什么学习 Spring。 今天,这篇就来说说 Spring 中的核心概念之一 IoC。 IoC 这个概念对于初学者来说还真不是很好理解,我就是那个理解不了的初学者。

    2024年02月07日
    浏览(38)
  • 【Spring】一文带你吃透IOC技术

    个人主页: 几分醉意的CSDN博客_传送门 loC,Inversion ofControl: 控制反转,是一个理论,一个指导思想。指导开发人员如何使用对象,管理对象的。把对象的创建,属性赋值,对象的声明周期都交给代码之外的容器管理。 loC分为控制和反转    ● 控制: 对象创建,属性赋值,对

    2023年04月08日
    浏览(52)
  • Spring IoC容器、IoC与DI

    目录 Spring是什么? 理解容器  什么是IoC(Inversion of Control) 传统的new创建对象的方式中类与类的耦合程度很大。  IoC的优势:  Spring IoC容器最核心的功能  什么是DI (Dependency Injection) IoC和DI的区别  Spring是指Spring Framework(Spring框架),它是开源的框架,有着很庞大的社区,通过

    2023年04月21日
    浏览(98)
  • spring ioc容器

    ioc是 inversion of Control的简写,意为控制反转。通过其对所有的Java对象的实例化和初始化,控制对象与对象之间的依赖关系。 (1)控制反转是一种思想。 (2)控制反转是为了 降低程序耦合度,提高程序扩展力。 (3)控制反转,反转的是什么? 答:将对象的创建权利交出去

    2024年01月17日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包