• Spring框架之IOC容器的底层原理(一篇就会)


    一、什么是IOC?

    对于IOCSpring官网是这样描述的:

    IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies (that is, the other objects they work with) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method. The container then injects those dependencies when it creates the bean. This process is fundamentally the inverse (hence the name, Inversion of Control) of the bean itself controlling the instantiation or location of its dependencies by using direct construction of classes or a mechanism such as the Service Locator pattern.

    译文:

    IoC也被称为依赖注入(DI)。它是一个对象仅通过构造函数的参数、工厂方法的参数或在对象实例构造,或从工厂方法返回后在对象实例上设置属性来定义其依赖关系(即,它们使用的其他对象)的过程。然后,容器在创建bean时注入这些依赖项。这个过程基本上是bean本身的逆过程(因此称为控制反转),通过使用类的直接构造或服务定位器模式等机制来控制其依赖项的实例化或位置。

    翻译确实发现官腔确实很难理解,那么现在就通俗易懂的来解释一下:

    IOC(Inversion of Control)控制反转,就是通常我们所说的IOC容器。没有这个IOC之前,对象的控制权都需要我们手动去管理,现在将对象的创建,对象的生命周期以及它们之间的依赖关系全部交给Spring容器去管理。目的就是降低耦合度。

    二、IOC过程

    Spring对于IOC的实现主要原理就是XML解析,反射,以及工厂模式。

    下面以图解方式逐渐的来说明什么是IOC原理。

    1. 原始的对象间调用

    下图简单的展示了最原始的对象调用的方式,直接在UserService类中的方法去创建UserDao类的对象然后调用UserDao类中的add()方法。

    这种原始的方式虽然可以达到我们所需要的效果,但是代码的耦合度太高,如果UserDao中的路径与方法发生变化,毋庸置疑,UserService也要跟着变化。

    下面通过工厂模式将上面的过程进行一个解耦:

    2. 工厂模式解耦

    现在我们将创建UserDao这个对象使用工厂模式去创建这个对象,然后UserService中用工厂来使用UserDao对象,这样就将这两个对象之间进行了解耦,降低了耦合度。

    我们发现UserFactory中也创建了UserDao这个对象,说明对象与对象之间必然会存在着耦合度,但是如何将耦合度降低到最大的程度是值得深究的,很显然上面的这种方式并没有将耦合度降低到最低。

    下面再通过加上XML解析与反射就可以将耦合度降到最低。

    3. XML,反射实现最大限度解耦

    首先,将UserDao对象配置到Spring提供的XML文件中。

    <bean id="userDao" class="com.jektong.dao.UserDao">bean>

    再次使用工厂模式去创建UserDao这个对象,不过此时就需要使用XML解析的方式去获取上面xml配置的class标签中的值,也就是类所在的包路径。

    得到这个包名之后可以通过反射机制来创建对象,反射创建对象的方法是newInstance(),这个方法要记住。以下是这个过程的伪代码:

    1. class UserFactory{
    2. public static UserDao getUserDao(){
    3. String valueName = class.值 // xml解析获取值
    4. Class classzz = Class.forName(valueName) // 反射或取得类
    5. return (UserDao)classzz.newInstance();
    6. }
    7. }

    这就是IOC的过程,以上代码是这样实现进一步解耦的,当UserDao这个类发生变化时,比如UserDao路径发生变化,我们只需要修改XML文件中的class标签值即可,无需修改其他额外内容。

    三、IOC容器

    下面就来说说,Spring是如何使用IOC思想来实现IOC控制反转的。IOC本质是一种思想,那么IOC容器就是它的实现方式。而IOC容器的底层就是对象工厂。

    IOC容器的实现方式,Spring提供了两种:BeanFactory与ApplicationContext

    1. BeanFactory

    IOC最基本的实现,是Spring内部最基本的实现,不提供给开发人员去使用。加载配置文件的时候,使用的是延迟加载的方式,只有获取到某个对象的时候,才会调用getBean()方法的时候才会创建对象,这样做如果出现一些Bean的配置问题就不好被发现。

    2. ApplicationContext

    作为BeanFactory的子接口,提供更多强大的功能,一般在开发时使用。当加载配置文件的时候,即容器一开始创建的时候,就加载所有的对象,唯一不足就是占用内存比较大。

     ApplicationContext所有的实现类如下:

     
    
     
    

  • 相关阅读:
    常见优化器总结
    ssm学生成绩管理
    读高性能MySQL(第4版)笔记07_优化数据类型(下)
    Docker基础—CentOS中卸载Docker
    自媒体内容发布要求有哪些?
    ragflow 大模型RAG知识库使用案例
    java基于springboot在线学习教育网站管理系统附代码段
    apache html调用bash脚本案例
    信息系统项目管理师(第四版)教材精读思维导图-第十三章项目资源管理
    RTX3090+win10+CUDA11.6+cudnn8.5.0+pytorch1.12.1 环境——个人配置经验
  • 原文地址:https://blog.csdn.net/qq_41857955/article/details/126216583