首页 > 其他分享 >Spring的核心思想之一IOC:仿Spring自定义一个实现IOC的容器

Spring的核心思想之一IOC:仿Spring自定义一个实现IOC的容器

时间:2024-03-12 16:22:50浏览次数:25  
标签:容器 factoryBeanInstanceCache 自定义 对象 Spring Cache IOC

  IoC Inversion of Control (控制反转/反转控制),是⼀个技术思想而不是⼀个技术实现。它描述的是Java开发领域对象的创建,管理的问题 ——传统开发⽅式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象,而在 IoC思想下开发⽅式:使用者不⽤⾃⼰去new对象了,由IoC容器(Spring框架或其他)帮助使用者实例化对 象并且管理它,使用者需要使⽤哪个对象,去问IoC容器要即可。

  在这个过程中使用者丧失了⼀个权利(创建、管理对象的权利),同时得到了⼀个福利(不⽤考虑对象的创建、管理等⼀系列事情) 为什么叫做控制反转呢?

     控制:指的是对象创建(实例化、管理)的权利

     反转:控制权交给外部环境了(spring框架、IoC容器)

  在https://www.cnblogs.com/ilovebath/p/14531263.html实现了一个仿Mybatis的框架,其基本思路是:

    1、解析配置文件至响应数据结构

    2、Executor进行操作,并保存结果到相应数据结构中。

  通过研究相关资料以及类似实现自定义访问持久层的思路,也实现了一个自定义的IOC,代码地址https://gitee.com/duckinpool/homework_2021/tree/master/1.2_spring/code/。大致目录如下:

                    

  其大致思路也是:1、解析文件,保存数据到内存数据结构中。

          2、读取数据结构中数据并根据它们实例化对象,并保存到内存数据结构中(即所谓的容器中)。

  其过程呢,大致如下:

          

  通过上面注解和代码分析可得:

    1、保存解析文件的数据结构为beanDefinitions,其本质就是一个列表List<LFBeanDefinition>。而LFBeanDefinition则是保存了类名及类路径。  

          

    2、根据BeanDefinition实例化。

          

      通过代码可知实例化本身逻辑比较明晰,如果在已存在这个类名,就直接获取这个对象;如果没有就newInstance这个类同时保存到这个Cache中。那么这个Cache究竟是什么呢?

          

      Cache本质就是一个Map,需要注意的是除了该Cache外还有个Cache——factoryBeanInstanceCache——这个Cache有何用呢?自动注入中继续分析。

    3、自动注入。

      该过程相对复杂是因为在这个过程中细节比较多,特别需要关注的是依赖注入DI(DI中可能涉及动态代理——敲重点)。

          

    getBean代码如上图,图中绿框部分逻辑为:如果在factoryBeanObjectCache中没有——即没有实例化,则没有该类对象。如果有,而factoryBeanInstanceCache中没有,则将自动注入后的对象put进去,最后返回的也是factoryBeanInstanceCache中的对象。

    综上所述,factoryBeanInstanceCache就是使用者获取待使用对象的容器。那么自动注入的过程就是在put factoryBeanInstanceCache之前的代码中体现:

          

    关于BeanPostProcessor本文中不关注(不是本文中阐述IOC的内容),关注的只有populateBean这段。

          

          

    可以看到对factoryBeanObjectCache中的instance利用JKD中反射为其field注入factoryBeanInstanceCache中的对应对象。

    本文中DI实现使用的是递归的模式,同时也没有展现出DI过程中可能涉及到的动态代理(其中涉及Spring中三级缓存)。总言之,本文中的自定义容器基本实现了Spring容器的简单功能,底层机构类似。后续研究Spring框架结构可以重点研究下DI过程中涉及动态代理的实现,以及三级缓存相关使用。

 

标签:容器,factoryBeanInstanceCache,自定义,对象,Spring,Cache,IOC
From: https://www.cnblogs.com/ilovebath/p/18068151

相关文章

  • springboot-02理解 自动配置原理
    在进行springboot的多环境配置:可以选择激活那一共配置文件在properties下使用spring.profiles.active=.dev.test等在yaml下可以使用-------来进行分割环境配置测试环境server:port:8082spring:Profiles:dev/test;active:只需通过选择不同调用的环境参数进行声明即可......
  • 深入探索Spring注入:解锁@Autowired与构造器注入的秘密
    好久没有写JAVA了今天突然看到Sonarlint的提示  什么??竟然不推荐这样写?难道我一直写的都是错的??所以我深入了解了一下为什么要我改成构造函数注入在Spring框架中,依赖注入(DI)是一种核心功能,它允许对象通过构造函数、setter方法或字段直接定义其依赖关系。这里,我们专注于两种......
  • Spring 知识点
    SpringSpring是什么?Spring为了解决企业级应用的复杂性而创建,简化开发。如下简化:基于POJO的轻量级和最小侵入性编程;以IoC(控制反转)、DI(依赖注入)和面向接口实现松耦合;基于AOP(切面编程)和惯性进行声明式编程;以切面和模版减少样式代码;SpringIoC(控制反转)IoC负责创建、......
  • springboot-yaml语法
    SpringBoot使用一个全局的配置文件,配置文件名称是固定的application.properties语法结构:key=valueserver.port=8080application.yml语法结构:key:空格value普通的key-valueserver:port:8080yaml后缀配置可以存储对象,而properties只能保存键值对yaml不仅可以用来......
  • vue自定义指令
    这里记录下,自定义指令相关思路,用到vue3+elementplus:说明一下使用场景:创建自定义指令v-hasPermi,用来判断按钮权限的(新增/编辑/删除/查看等)。1.页面使用(全局使用,无需引入):<el-buttontype="primary"icon="Plus"plainv-hasPermi="['bid:bidding:save']">添加</el-butt......
  • Spring中使用自带@Autowired注解实现策略模式
    场景SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130503707设计模式-策略模式在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/d......
  • vue 3+TS 封装自定义右键全局菜单(虚拟节点)
    有时我们需要点击(右键或左键)某个元素时弹出菜单,实现复制、粘贴、删除等功能。本文将介绍如何封装一个自定义的右键全局菜单(无三方依赖)。封装的菜单可自定义菜单项,图标,禁用,分割线,隐藏等。并且可以在全局任意地方使用。源码在文章末尾。效果使用<template><div><div@......
  • scapy编写自定义协议
    编写自定义格式的步骤如下首先先定义一个类,把所有的字段标注下来,每个字段占用几个字节或者几个bit例子:我们这里需要构造一个trill协议的数据包,但是scapy没有对这个的支持,查看官方的协议手册https://www.rfc-editor.org/rfc/rfc6325.html#section-3.8classTRILL(Packet):......
  • carousel 轮播自定义进度条
    <!--VueSFC--><template><divclass="propor-box"><divclass="p20"><div><el-carousel:interval="5000"arrow="always"height="250px">&......
  • cnetos7 ISO 镜像自定义制作
    简介:  此自定义镜像针对centos7系统版本,通过tar打包原系统服务将其放入ISO镜像中在安装时执行解压导入新安装系统中实现系统服务的自定义安装。针对cnetos7目前只测试出这一种方案,暂时没找到其他好的方案实现系统的模板ISO制作,目前版本存在缺陷镜像中的tar包非加密......