2.动手写简版spring之IOC解耦篇

从补码原理到实践:RISC-V中addi指令的符号扩展机制详解 本文深入解析了RISC-V架构中addi指令的符号扩展机制。从补码的数学原理出发,详细阐述了12位立即数在指令编码中如何通过符号位进行扩展,并结合lui指令,揭示了加载任意32位立即数的正确方法与实践陷阱,帮助开发者编写高效可靠的底层代码。 阅读详情

0、目标

动作写简版spring之IOC篇的重构,将原有的ClassPathXmlApplicationContext类拆分多个类。让职责清晰。

1、核心原理

原有的ClassPathXmlApplicationContext大包大揽,现在只让它做一个组织管理者,具体的工作交给专业的对象。
1、xml文件被抽象为ClassPathXmlResource (还给它配了一个接口Resource)。
2、定义一个框子SimpleBeanFactory( 还给它配了一个接口Beanfactory ),给出配置信息,能够获取bean(懒加载)。
3、读取xml的事情,交给XmlBeanDefinitionReader,它负责读取Resource后把Bean的定义配置传给Beanfactory 。

2、类与类之间关系

这些类之间的关联关系如下:

  • XmlBeanDefinitionReader 类依赖 Beanfactory 类,通过构造函数接收 Beanfactory 对象,并在 loadBeanDefinitions 方法中调用 beanfactory 的 registerBeanDefinition 方法。
  • SimpleBeanFactory 类实现了 Beanfactory 接口,提供了 getBean 和 registerBeanDefinition 方法的具体实现。
  • ClassPathXmlResource 类实现了 Resource 接口,用于从指定的 XML 文件中读取元素信息。
  • ClassPathXmlApplicationContext 类在构造函数中创建了 ClassPathXmlResource、SimpleBeanFactory 和 XmlBeanDefinitionReader 对象,并通过 XmlBeanDefinitionReader 加载 XML 中的 bean 定义到 SimpleBeanFactory 中。同时,提供了 getBean 和 registerBeanDefinition 方法。
  • Main 类使用 ClassPathXmlApplicationContext 来获取 bean 对象。

总的来说,这些类协同工作,实现了一个简单的基于 XML 配置的 IoC 容器的功能。

2.1 BeanDefinition

封装基础配置信息

public class BeanDefinition {
    private String id,className;

    public BeanDefinition(String id, String className) {
        this.id = id;
        this.className = className;
    }
    ……

2.2 BeanException

自定义异常

public class BeanException extends Exception {
    public BeanException(String message) {
        super(message);
    }
}

2.3 ClassPathXmlResource

Resource 接口

public interface Resource extends Iterator<Object> {

}

ClassPathXmlResource 类

public class ClassPathXmlResource implements Resource {

    private Document document;
    private Element rootElement;
    private Iterator<Element> elementIterator;

    public ClassPathXmlResource(String filename) {
        SAXReader saxReader = new SAXReader();
        URL resource = this.getClass().getClassLoader().getResource(filename);
        try {
            this.document = saxReader.read(resource);
            this.rootElement = document.getRootElement();
            this.elementIterator = this.rootElement.elementIterator();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean hasNext() {
        return this.elementIterator.hasNext();
    }

    @Override
    public Object next() {
        return this.elementIterator.next();
    }
}

2.4 SimpleBeanFactory

先定义一个接口,Beanfactory 接口

public interface Beanfactory {
    Object getBean(String BeanName) throws BeanException;
    void registerBeanDefinition(BeanDefinition beanDefinition);
}

SimpleBeanFactory类,就是生成类的工厂,不干别的,目前是懒加载,给定义就行。


public class SimpleBeanFactory implements Beanfactory{

    private List<BeanDefinition> definitions = new ArrayList<>();
    private List<String> beanNames = new ArrayList<>();
    private Map<String,Object> singletons = new HashMap<>();

    public SimpleBeanFactory() {
    }

    @Override
    public Object getBean(String beanName) throws BeanException {
        Object o = singletons.get(beanName);
        if(o==null){
            if(!beanNames.contains(beanName)) {
                throw new BeanException("Can not find BeanName equals "+ beanName);
            }
            BeanDefinition beanDefinition = definitions.get(beanNames.indexOf(beanName));
            try {
                o = Class.forName(beanDefinition.getClassName()).newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            singletons.put(beanDefinition.getId(),o);
        }
        return o;
    }

    @Override
    public void registerBeanDefinition(BeanDefinition beanDefinition) {
        this.definitions.add(beanDefinition);
        this.beanNames.add(beanDefinition.getId());
    }
}

2.5 XmlBeanDefinitionReader

组装者,胶水。
将Resource 以及 ClassPathXmlResource 的信息写入到 beanfactory


public class XmlBeanDefinitionReader {
    Beanfactory beanfactory;

    public XmlBeanDefinitionReader(Beanfactory beanfactory) {
        this.beanfactory = beanfactory;
    }

    public void loadBeanDefinitions(Resource resource){
        while (resource.hasNext()){
            Element element = (Element)resource.next();
            String id = element.attributeValue("id");
            String aClass = element.attributeValue("class");
            BeanDefinition beanDefinition = new BeanDefinition(id, aClass);
            this.beanfactory.registerBeanDefinition(beanDefinition);
        }
    }
}

2.6 ClassPathXmlApplicationContext

一身轻了!

public class ClassPathXmlApplicationContext {
    Beanfactory beanfactory;

    public ClassPathXmlApplicationContext(String fileName) {
        ClassPathXmlResource resource = new ClassPathXmlResource(fileName);
        Beanfactory beanfactory = new SimpleBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanfactory);
        reader.loadBeanDefinitions(resource);
        this.beanfactory = beanfactory;
    }

    public Object getBean(String beanName) {
        try {
            return this.beanfactory.getBean(beanName);
        } catch (BeanException e) {
            e.printStackTrace();
            return null;
        }
    }

    public void registerBeanDefinition(BeanDefinition beanDefinition){
        this.beanfactory.registerBeanDefinition(beanDefinition);
    }

}

结语

这么一来,代码清晰了吗。感觉类变多好多。但是没有关系,就像很多创业公司会演化很多机构一样,ioc要发展 还是要演化出更多的机构,各负其责。
下一篇 3.动手写简版spring之IOC构造函数篇

本专栏做一个简版的spring ,通过动手实践进一步理解ioc、aop、mvc、jdbcTemplate登。
项目代码分享在 https://github.com/forestnlp/minispring

别再只会复制Haar级联代码了!OpenCV人脸检测全方案深度解析,从原理到工业级落地 通用预训练模型在你的业务场景效果不好时,用自己的业务数据集训练专属的级联器,是提升精度的终极方案,OpenCV自带和工具,支持自定义Haar/LBP级联器训练。场景首选方案次选方案新手入门学习Haar级联分类器LBP级联分类器嵌入式轻量固定场景LBP级联分类器YuNet轻量版工业级落地项目(99%场景)DNN+YuNetMTCNN多人脸+小目标复杂场景DNN+YuNet自定义微调模型同时做人脸+其他目标检测。 阅读详情

相关推荐

R语言实战:5分钟搞定NHANES数据库的加权分析与可视化(附完整代码)

本文提供了一份R语言实战指南,帮助研究者在5分钟内完成NHANES数据库的加权分析与可视化。通过详细的代码示例,涵盖数据获取、清洗、加权分析和可视化全流程,特别适合公共卫生和流行病学研究者快速掌握复杂抽样数据的处理方法。

www00的博客 255

【Spring】IOC与解耦合

回想写过的图书管理系统、租房系统、电影院卖票系统都是基于原生的JavaSE、OOP,没有用到任何框架,在层与层的关系中一个类要想获得与其他类的联系主要的方式还是靠new,这就导致层与层之间、对象与对象之间的依赖性强“动一发而迁全身”。特别是在处理数据层和业务层之间时,由于对象没有统一管理导致很复杂!而Spring中的IOC就很好地解决了这一问题,降低耦合就是它的一大特色...........................

懒羊羊的博客 8452

open-web UI 实用指南

open-web UI 类似于chatgpt的界面,可以私有化模型本地部署,也可以用商业模型.本文只是用开源模型. 它以实现多模态AI聊天 , AI 翻译 , 语音转文本, 文本转语音, 文生图,代码助手,可谓利器。

szmars的博客 3万+

从IOC方面谈谈我个人对Spring方便解耦这点的理解

本篇文章记录了我个人对Spring框架能够解耦这一优点的理解,将它分享出来和大家一起学习交流,同时也欢迎大家纠错改正 相信大家对 Spring 的 IOC 和 DI 并不陌生了,它们为 Spring 框架带来了方便解耦这一优点。我在学习完Spring框架的IOC 和 DI 之后的初期阶段,对它们的概念和用法有了基础性的认识和掌握。 若对这两个知识有遗忘请戳: 我的文章:https://bl...

优快云_猹的博客 4247

Seafile搭建以及onlyoffice在线办公

部署seafile docker-compose.yml 如下: 参考此篇文章 version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=db_dev # mysql root的密码,同时修改 seafile的DB_ROOT_PASSWD与这个一致 - MYSQL_LOG_CONSOLE

dwdcth的专栏 4656

【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Pytorch-DirectML篇)】

这篇是之前Tensorflow-DirectML的姊妹篇,如果对TF感兴趣的可以搜索我的博文。 首先我们丢一个官网地址,但是官网那个会误导新人如果你按那个操作的话。 https://docs.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 这里用我的方法操作: 首先声明一下,因为我的显卡是AMD RX6600,不带XT(性能和RTX3060 12G版本半斤八两),所以目前没有最新的WSL2驱动,如果有了的话欢迎告知我,所以我这里就.

weixin_44029053的博客 2万+

Spring IoC:解耦与控制反转的艺术

Spring IoC(控制反转)是Spring框架的核心思想之一,它通过将对象的创建和管理权交给Spring容器,实现了代码的解耦与灵活性。IoC不仅简化了开发流程,还提高了系统的可测试性和可维护性。通过控制反转,开发者可以更专注于业务逻辑的实现,而不是对象的创建与管理。掌握Spring IoC的思想与实践,是每一位Spring开发者必须具备的核心能力,也是构建高质量、可扩展应用的重要基石。希望本文能帮助你理解 Spring IoC 的核心概念,并在实际项目中灵活运用!

2302_81090306的博客 1349

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

浅谈Spring如何解耦和IOC

1.传统三层架构耦合性高。 首先来谈一谈传统的web应用三层架构,这样有助于我们理解spring是怎么来降低系统的耦合度的。 如下图所示,web层通过调用相关的service来实现业务逻辑的实现,而service通过DAO层来进行数据的CRUD操作。假设,当前系统使用的是Mysql数据库,突然有一天,老板说要用Oracle数据库,如果使用的是如下开发结果,那么就需要再也一套Oracle的servi...

weixin_42596778的博客 1499

CAPL编程入门:从零开始掌握汽车通信脚本语言

本文详细介绍了CAPL编程的基础知识,从开发环境搭建到核心语法精要,再到总线通信实战和高级调试技巧。CAPL作为汽车通信脚本语言,专为CAN、LIN等网络协议设计,帮助工程师高效完成车载网络测试。通过实战案例和性能优化建议,读者可以快速掌握CAPL编程技能。

s1t2u3的博客 978

第四节:Vben Admin登录对接后端getUserInfo接口

上一节,我们完成了/api/auth/login接口的创建,通过login接口,我们完成了登录和Token的生成。但是登陆还是报404返回,发现是Vben Admin又请求了一个/api/getUserInfo接口,本节我们就来分析完成这个接口本节,我们完成了getUserInfo接口,完成了登录操作,成功的进入到工作台页面。

cuiwin的专栏 2846

【Spring】IoC 和 DI的关系、简单使用,从“硬编码“到“优雅解耦“:IoC与DI的Spring蜕变之旅

在Spring生态中,控制反转(IoC)与依赖注入(DI)如同硬币的两面,共同构建了松耦合的编程范式。本文深度剖析IoC作为设计思想与DI作为实现手段的辩证关系:IoC将对象控制权移交容器,而DI通过构造器、Setter等方式完成依赖传递。通过三个渐进式案例——从基础配置到图书管理系统改造,生动演示了如何用@Component和@Autowired实现组件解耦。你会发现,传统new操作符的硬编码如何被Spring的依赖注入优雅取代,使得代码维护性、扩展性得到质的飞跃。

Code哈哈笑的博客 1361

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | AAAI 2025 | 将 CEM 颜色增强模块引入RT-DETR ,目标检测不再惧怕雾天和低光检测、小目标检测、遥感目标检测高效涨点

本文提出了一种新型结构引导去雾网络(SGDN),通过双色引导桥(BGB)和色彩增强模块(CEM)有效解决雾霾图像去雾问题。BGB利用YCbCr空间的纹理特征引导RGB特征恢复,CEM通过聚合YCbCr通道信息增强RGB色彩感知。实验证明该方法在真实雾霾数据集上优于现有技术,能同时保持色彩准确性和纹理清晰度。文章还提供了完整的代码实现和模型配置指南,包括三种改进版RT-DETR网络结构(rtdetr-l/r18/r50-CEM.yaml),为图像去雾和目标检测任务提供了实用解决方案。

Ai缝合怪、助力小伙伴高效发论文 351

Spring-IoC 篇

在 Spring IoC 容器中,每个被管理的对象都由一个 Bean 定义来描述。Bean 定义包括对象的类型、依赖关系、生命周期等信息。

小周不想写代码的博客 2657

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring-IOC 解耦详解

前言 耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。 耦合性存在于各个领域,而非软件设计中独有的,但是我们只讨论软件工程中的耦合。 在软件工程中, 耦合指的就是就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类...

yaochen2507的博客 1435

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Spring篇】初识 Spring IoC 与 DI

Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽ 庞⼤的社区

m0_56361048的博客 822

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring ≈ IoC纵向解耦 + AOP横向解耦

IoC和AOP是Spring框架实现松耦合的两大核心机制:IoC通过依赖注入实现纵向层级解耦,让业务层与基础设施层(如Service与DAO)解绑,替换实现只需修改配置;AOP通过动态代理实现横向功能解耦,将日志、事务等公共逻辑从业务代码中剥离,避免重复代码。两者协同工作,IoC管理对象依赖关系,AOP增强跨模块功能,共同构建高内聚低耦合的系统架构,让开发者能专注核心业务逻辑。

QING的博客 762

《Java 100 天进阶之路》第73篇:Spring IoC容器(2026版)

Spring全家桶专题开篇之作!IoC(控制反转)是Spring最核心的基石——将对象的创建和依赖管理从代码转移到容器。一文掌握IoC与DI的关系(思想 vs 实现)、BeanFactory vs ApplicationContext(懒加载 vs 预加载)、Bean生命周期五阶段(实例化→属性填充→初始化→使用→销毁)、三种配置方式(XML/注解/Java配置)。附完整代码示例、避坑清单、面试高频考点与追问陷阱。理解了IoC容器,就理解了Spring的"心脏"!

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 8254

【Spring】IOC与解耦合_关于spring的解耦合

这个时候map里就有各种对象了,接下来我们在代码里需要用到里面的对象时,再通过DI注入(autowired.resource等注解, xml里bean节点内的ref属性,项目启动的时候会读取xm|节点ref属性根据id注入,也会扫描这 些注解,根据类型或id注入: id就是对象名),所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂,固体胶”的作用,把系统中的所有对象粘合在一起发挥作用, 如果没有这个"粘合剂",对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

2401_87556704的博客 1102

Spring中基于xml的IOC解耦

IOC是什么 控制反转,顾名思义就是控制权发生反转,例如 IUserService service = new UserService(); IUserService service= (IUserService) BeanFactory.getBean("UserService"); 上面那一段控制权是new,就是完全自主控制引用那个dao,下面那个是把控制权交给BeanFactory,由BeanFactory通过后面的字符串配置。这种控制权的转移就叫控制反转。 IOC能做什么 削减计算机程序的耦

Rocky balboa 824

【javaEE】Spring IOC

容器是⽤来容纳某种物品的(基本)装置。(有点废话)我们想想,之前课程我们接触的容器有哪些?• List/Map->数据存储容器• Tomcat->Web容器那么Spring也作为一个容器,装的是对象(Bean)这里的Bean跟在Java基础语法中是不一样的,在Javase中Bean指的是实体类,比如Student类在JavaEE进阶中,Bean指的是Spring管理的对象。

mr_yuanshen的博客 1300

【Spring5】IOC容器与解耦合

控制反转(Inversion of Control),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。控制反转,把对象的创建和对象之间调用的过程交给Spring进行管理;为了降低耦合度。本文对IOC容器的原理、工厂模式以及基于xml解析形式操作Bean管理进行了讲解。

黄小黄的博客 1233

IOC 和 DI的实现,代码解耦,Spring 和 Java

IoC — Inversion of Control (IoC) 控制反转DI — Dependency injection (DI) 依赖注入关于 IoC 和 DI 的概念,阅读以上两篇文章即可。那么,IoC 和 DI 是如何实现「低耦合」的,代码来自 前一篇文章这里已经埋下伏笔了。IoC 有被称为 Spring Container。

RR1335 之代码才是动力源 989

Spring Web中的三层架构、分层解耦、IOC和DI解析

三层架构是开发应用时常用的一种设计模式,它将应用分成三个主要部分:表示层(或称视图层)、业务层和数据访问层。表示层(Web层):负责接收用户的请求并将响应返回给用户。它主要处理与用户交互的逻辑,比如请求的接收、输入验证、结果展示等。常见的实现技术包括Spring MVC、JSP等。业务层(Service层):包含具体的业务逻辑。在Spring框架中,通常由@Service注解标记的类来实现。业务层与表示层解耦,专注于处理具体的应用业务,确保业务逻辑的复用和独立性。数据访问层(DAO层)

2302_80043968的博客 997

Spring的IoC解耦合学习与实践

weixin_51492999的博客 578

IOC容器逻辑上如何解耦

初学SpringIOC容器,我们对于解耦可能还是处于一个相对抽象的概念理解,后面作者也是查找了一些资料,本片文章就用一个例子来说明IOC容器解耦的妙处 假设现在公司需要完成一个与新闻公司的合作项目,项目需要与新闻社进行合作,获取新闻社的新闻并且存储到我们的数据库中,用于展示。 我们可以分析一下:当有新的新闻时,通过我们设计的程序,定时的到指定的新闻服务器下,去抓取最新的新闻,然后将这些新闻在通过指定的程序存储到我们的数据库中。因此整个处理过程就分为两大块:...

qq_57205114的博客 1888
上一篇: 1.动手写简版spring之IOC初创篇
下一篇: python装饰器
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值