搜索
简帛阁>技术文章>一文带你深入剖析Spring IOC 实现原理

一文带你深入剖析Spring IOC 实现原理

IOC是什么

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

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

Spring全家桶地址:Spring最新全家桶资料集锦

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

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

为什么使用IOC

使用IOC最大的好处就是减少了代码的耦合度,降低了程序的维护成本。可能很多人都知道这个道理,就是不太明白它到底是怎么降低的,别慌下面让我来给大家讲解一下。

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

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

传统做法

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

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

代码之间的耦合关系图:

image.png

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

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

使用IOC的做法

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

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

转变之后的耦合关系图:

image.png

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

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内部使用的,并不是专门为框架的使用者提供的。

我们一般使用的是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("src\main\resources\配置文件名");

Spring的IOC实现原理

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

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

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

目录一、什么是SpringIOC容器二、IOC有哪些优点三、控制反转(IOC)有什么作用四、IoC和DI有什么区别五、SpringIoC的实现机制六、IoC支持哪些功能七、BeanFactory和Ap
内容较多,新开一贴,以便阅读和讨论,请管理员见谅。IOC的基础下面我们从IOC/AOP开始,它们是Spring平台实现的核心部分;虽然,我们一开始大多只是在这个层面上,做一些配置和外部特性的使用工作,
Spring容器高层视图Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,
控制反转IOCSpring通过一种称作控制反转的技术来更好的实现低耦合。那么什么是控制反转呢?在了解控制反转之前我们先要了解IOC容器怎么管理对象,通常我们直接在对象内部通过new进行对象的创建,是
文相关代码(来自官方源码springtest模块)请参见springdemysifyorgspringframeworkmylearntest包下。IoC三种注入方式构造方法注入publicFXNe
1IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。图1:软件系统中耦合的对象如果我们打开机械式手表的
概念IOC实现原理IOC创建BeanFactory工厂创建Bean实例并构建关系网扩展点生动描述Ioc链接上一篇:spring框架组件分析概念IOCIoc英文为InversionofControl,
目录1IOC的理论背景2什么是控制反转(IoC)3IOC的别名:依赖注入(DI)4IOC为我们带来了什么好处5IOC容器的技术剖析6IOC容器的一些产品7使用IOC框架应该注意什么1IOC的理论背景
从总体到局部总控制反转:理论思想,原来的对象是由使用者来进行控制,有了spring之后,可以把整个对象交给spring来帮我们进行管理DI(依赖注入):把对应的属性的值注入到具体的对象中,@Autow
IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩。java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用