您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

确定不了解一下Spring两大核心之一的IOC容器嘛

时间:2021-01-27 11:15:44  来源:  作者:

今天菜鸟和大家一起来探讨一下Spring两大核心之一的“IOC”。

IOC是什么

IOC是“Inversion of Control”的缩写,翻译过来就是“控制反转”。

我们先不深究其在Spring中的含义,先从字面上进行分析。打个比方来说:结婚前你的工资完全由你来支配,想怎么花就怎么花。结婚后变了,你的钱要上交给你媳妇了,你想花的时候得申请。此时你对工资的控制转变了,由原来的你控制,变成了你媳妇控制。这就是“控制反转”,本来属于你控制的事情,交由别人来控制,而你只在需要的时候进行获取就可以了。

相信通过这个比喻大家对“控制反转”的含义都已经理解了,那么它在Spring中的体现就是:把创建对象的过程交给Spring来进行管理,从而做到将原来需要自己手动new对象,变成直接从Spring中获取。

这就就好比Spring中有一个容器,我们将Bean放到这个容器中,让这个容器为我们创建实例,当需要时我们直接从这个容器中进行获取即可。这个容器的实现理念就是IOC。

确定不了解一下Spring两大核心之一的IOC容器嘛

 

为什么使用IOC

使用IOC最大的好处就是减少了代码的耦合度,降低了程序的维护成本。

可能很多人都知道这个道理,就是不太明白它到底是怎么降低的,别慌下面让我来给大家讲解一下。

假设现在有一道菜:宫保鸡丁。

// 伪代码
public class KungPaoChicken {
    
    public static KungPaoChicken getKungPaoChicken(各种食材) {
        // 加工各种食材最终得到一份美味的宫爆鸡丁。
        return KungPaoChicken;
    }
}

传统做法

如果现在不使用IOC,我们想要吃到宫保鸡丁,那么就需要如下操作。

// 伪代码
public class Person() {
    // 采购各种食材
    // 准备好各种食材通过KungPaoChicken获取到一份宫保鸡丁。
    KungPaoChicken kungPaoChicken = KungPaoChicken.getKungPaoChicken(各种食材);
}

代码之间的耦合关系图:

确定不了解一下Spring两大核心之一的IOC容器嘛

 

看起来也不难,也不麻烦对吧?

别着急下定论,现在只是一个人想要宫保鸡丁,假如现在有10个人都想要那?是不是有十份相同的代码?这10个人都和KungPaoChicken有耦合。又比如现在需要的食材有所改变,那这样的话是不是这10个人都需要调整代码?这么一来是不是发现这种实现方式一点也不友好。

使用IOC的做法

现在我们转变一下思路,不再自己动手做了,我们把这道菜的做法告诉饭店,让饭店来做。

// 伪代码
public class Restaurant {
    
    public static KungPaoChicken getKungPaoChicken() {
        // 处理食材,返回宫保鸡丁
        retur KungPaoChicken;
    }
}

转变之后的耦合关系图:

确定不了解一下Spring两大核心之一的IOC容器嘛

 

经过这样处理,就可以很大程度上解决上面的这些问题。

1、我们将KungPaoChicken交给Restaurant(饭店)来进行管理,它的创建由Restaurant进行。
2、现在不论是1个人还是10个人我们只需要从Restaurant中进行获取就可以了。这样耦合就改变了,Person只需要和Restaurant发生耦合就可以了。
3、当KungPaoChicken有变动时,也不需要每个人都变动,只需要Restaurant随之改变就可以了。

Spring的IOC容器就充当了上面案例中的Restaurant角色,我们只需要告诉Spring哪些Bean需要Spring进行管理,然后通过指定的方式从IOC容器中获取即可。

Spring提供的IOC容器

Spring提供了一个接口BeanFactory。这个接口是Spring实现IOC容器的顶级接口,这个接口是Spring内部使用的,并不是专门为框架的使用者提供的。

确定不了解一下Spring两大核心之一的IOC容器嘛

 

我们一般使用的是BeanFactory的子接口ApplicationContext接口,这个接口提供了更多并且更加强大的功能。

在ApplicationContext接口中有三个常用的实现类分别是:AnnotationConfigApplicationContext、FileSystemXmlApplicationContext、ClassPathXmlApplicationContext。

容器的创建需要读取配置文件或配置类,通过这些配置告诉Spring哪些bean是需要Spring来进行管理的。

注意:读取配置文件时,如果读取绝对路径时入参需要添加前缀“file:”,读取相对路径时入参需要添加“classpath:”。

AnnotationConfigApplicationContext

作用:用于在全注解开发时,读取配置类的相关配置信息。
注意:通过@Configuration注解标注当前类为Spring的配置类

示例代码

ApplicationContext context = new AnnotationConfigApplicationContext(自定义的配置类.class);

ClassPathXmlApplicationContext

作用:默认加载classPath下的配置文件,也就是代码编译之后的classes文件夹下。
注意:使用ClassPathXmlApplicationContext读取相对路径时入参的“classpath:”是可以省略的。读取绝对路径时,需要在入参添加前缀“file:”。

示例代码

// 相对路径
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:配置文件名称.xml");
ApplicationContext context = new ClassPathXmlApplicationContext("配置文件名称.xml");

// 绝对路径
ApplicationContext context = new ClassPathXmlApplicationContext("file:绝对路径下的配置文件路径");

FileSystemXmlApplicationContext

作用:默认加载的是项目的所在路径下的配置文件。

注意:对FileSystemXmlApplicationContext来说读取绝对路径时的入参前缀“file:”是可以省略的,但是读取相对路径的入参“classpath:”是必须的。

示例代码

// 相对路径
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:beans.xml");

// 绝对路径
ApplicationContext context = new FileSystemXmlApplicationContext("file:绝对路径下的配置文件路径");
ApplicationContext context = new FileSystemXmlApplicationContext("绝对路径下的配置文件路径");
// 直接从项目的路径下
ApplicationContext context = new FileSystemXmlApplicationContext("srcmainresources配置文件名");

Spring的IOC实现原理

Spring实现IOC容器的是通过:工厂 + 反射,实现的。

通过一张图来给大家讲解SpirngIOC的实现原理(基于XML配置文件)

确定不了解一下Spring两大核心之一的IOC容器嘛

 

如果是基于全注解形式的话,只是将读取配置文件的步骤改成了读取配置类,然后通过配置类获取需要创建实现的Bean,并通过反射将其创建。其整体实现思路和使用XML配置文件是一样的。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。



Tags:IOC容器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
环境:Spring5.3.3Spring容器启动时,创建 DefaultListableBeanFactory 工厂实例化 AnnotationConfigApplicationContext对象public AnnotationConfigApplicationContext(String...【详细内容】
2021-06-10  Tags: IOC容器  点击:(152)  评论:(0)  加入收藏
今天菜鸟和大家一起来探讨一下Spring两大核心之一的“IOC”。IOC是什么IOC是“Inversion of Control”的缩写,翻译过来就是“控制反转”。我们先不深究其在Spring中的含义,先...【详细内容】
2021-01-27  Tags: IOC容器  点击:(130)  评论:(0)  加入收藏
▌简易百科推荐
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  实战Java    Tags:Docker   点击:(10)  评论:(0)  加入收藏
在网页中渲染公式一直是泛学术工具绕不开的一个功能,最近更新产品功能,正巧遇到了这个需求,于是使用容器方式简单实现了一个相对靠谱的公式渲染服务。分享出来,希望能够帮到有类...【详细内容】
2021-12-01  编程菌zfn    Tags:Docker   点击:(10)  评论:(0)  加入收藏
1.1 docker命令直接部署1.1.1 拉取镜像docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafka1.1.2 启动zookeeper容器docker run -d --name myzookeeper -p 2...【详细内容】
2021-11-15  无    Tags:docker   点击:(47)  评论:(0)  加入收藏
01 前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以...【详细内容】
2021-10-29  小码哥聊软件测试    Tags:Docker   点击:(42)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  抓蛙程序猿    Tags:docker   点击:(48)  评论:(0)  加入收藏
环境:Spring5.3.10通常,应用程序开发人员不需要对ApplicationContext实现类进行子类化。相反,SpringIOC容器可以通过插入特殊集成接口的实现来扩展。使用BeanPostProcessor自定...【详细内容】
2021-10-26  Java网络研发架构师    Tags:Spring   点击:(33)  评论:(0)  加入收藏
我们在很多场景下都需要做笔记,来对抗遗忘,一份好的笔记不仅能在需要的时候供我们查阅,也能帮助我们归纳整理知识提高做事效率。 目前市面上有很多云笔记软件,体验上各有不同,但...【详细内容】
2021-10-11  运维贼船    Tags:docker   点击:(61)  评论:(0)  加入收藏
1. Nacos官网Nacos Docker 快速开始2. Clone 项目git clone https://github.com/nacos-group/nacos-docker.git3. cd 到nacos-docker 路径下 直接启动即可cd nacos-dockerdo...【详细内容】
2021-09-16  程序狗爱化妆    Tags:Nacos   点击:(109)  评论:(0)  加入收藏
今天不做保姆级教程,分享奶爸常用、好用的Docker应用。有了这些Docker,Nas的可玩性会大幅提高,有时候奶爸也在想,刨去官方套件不考虑的话,Nas真的是差不多。如果小伙伴们有需要,后...【详细内容】
2021-09-03  晋升奶爸的垃圾佬    Tags:Docker   点击:(167)  评论:(0)  加入收藏
环境要求 ubuntu系统:20.04 docker版本:20.10.7 redis版本:6.0.6步骤由于我这里已经有相应的redis镜像,这里就不记录了,关于docker一些基础知识可以看我以前的笔记开启3台re...【详细内容】
2021-07-26  石老师小跟班    Tags:Redis主从复制   点击:(117)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条