【Spring】-Spring的IoC和DI

news2025/2/12 1:02:01

作者:学Java的冬瓜
博客主页:☀冬瓜的主页🌙
专栏:【Framework】
主要内容:什么是spring?IoC容器是什么?如何使代码解耦合?IoC的核心原理,IoC的优点。依赖注入/对象装配/DI。

在这里插入图片描述

在这里插入图片描述

文章目录

    • 一、什么是Spring?
      • 1)什么是IoC容器?
        • 1> 理解
        • 2> 法一,传递(存在依赖关系传对象)
        • 3> 法二,使用Spring
          • Spring IoC 核心操作:
          • Spring IoC 优点:
      • 2)什么是DI?

一、什么是Spring?

Spring:包含了 众多工具方法IoC 容器。

1)什么是IoC容器?

1> 理解

IoC 全称 Inversion of Control,翻译为控制反转。因此IoC容器就是控制反转的容器。那啥是 控制反转?Spring框架管理Bean的创建工作。即由用户管理Bean变为框架管理Bean

① 举个例子:接下来我们举个例子,并使用代码来感受啥是个IoC(控制反转),有什么好处:
比如建造一个房子,粗略的看,首先需要打地基,然后砌砖,最后挂房梁瓦片等。如果用代码实现这样一个粗略的过程,看下面代码:

//测试类
public class Test {
    public static void main(String[] args) {
        House house = new House();
        house.init();
    }
}
//房
public class House {
    public void init(){
        // 创建房子 依赖于挂房梁等操作
        Beam beam = new Beam();
        beam.init();

        System.out.println("House: House create");
    }
}
//房梁
public class Beam {
    private String material;//(杉木)
    public void init(){
        // 挂房梁等 依赖于 砌好砖
        Brick brick = new Brick();
        brick.init();

        System.out.println("Bean: 房梁木用 " + this.material);
    }
}
//砖
public class Brick {
    private String redBrick;//红砖

    public void init(){
        // 砌砖 依赖于 已经打好地基
        Foundation foundation = new Foundation();
        foundation.init();

        System.out.println("Brick: 砌砖用 " + this.redBrick);
    }
}
//地基
public class Foundation {
    private String rebar;//钢筋
    private String cement;//水泥

    public void init(){
        System.out.println("Foundation: 打地基用 " + this.rebar +" "+ this.cement);
    }
}

上述代码运行结果如下:
在这里插入图片描述

② 理解代码:上面的代码中,测试类中的main方法运行后,会创建一个空House对象,再进行House对象的初始化;在House对象初始化时,会创建一个空的Beam对象,然后进行beam对象的初始化(house依赖于beam,房子依赖于房梁);beam初始化时,会创建Brick对象,再进行brick对象的初始化(beam依赖于brick,房梁依赖于砌好砖);brick对象初始化时,会创建Foundation对象,并进行foundation对象的初始化。
简单来说,要想建房子,得先挂好房梁,要想挂房梁,得先砌好砖,要想砌砖,得先打好地基,这就是一个逐层调用进行初始化的过程,最终建好一个房子。但是这样操作会引入一个很致命的问题:代码耦合度非常高!

③ 问题:这样互相依赖的过程,如果底层的类发生改变,上层的类得相应改变。在上面代码中,我使用钢筋水泥打地基,用红砖来砌砖,用杉木来做房梁木,在每个类的调用init方法时将所需参数传进去,进行材料的初始化(我这里没弄,所以都是null)。那么理解到这里我们可以想一个问题,如果我不再使用红砖来砌砖,而是使用水泥砖了,或者我需要制定特定尺寸的砖,那么Brick类的属性就需要修改调整。这样在上层调用中(beam)也需要修改,在Beam类的init方法中,创建了Brick类,并使用brick.init(参数)这个方法进行砌砖的初始化,那么这里也是需要修改的,如果上层还有给brick传参的方法,那也还需要改,所以这样操作,代码耦合度会非常高。

④ IoC和Spring:怎么才能降低耦合,减少修改的成本?因为上述代码出现高耦合的原因:在当前类中的方法中,创建当前类所依赖的类的对象并逐层调用初始化对象,或者上层的代码给底层的类的属性传参数。
法一:当存在依赖关系时,在当前类的方法中不再自己创建和销毁所依赖的对象,而是让调用者传一个依赖对象给当前类(当前类需要一个成员变量是它所依赖的类),如果这个类还存在其他属性,也由调用者提供参数(这样就可保证,在我需要修改某一个类的成员或者类型时,其他类不需要做修改,即实现解耦合)。
法二:那如果我不让它逐层调用,而是统一交给一个工具去创建对象并初始化并管理对象呢?这就是控制反转,Spring就是管理对象的这样一个容器。

⑤ Spring:在管理方面,Spring是一个 IoC容器,它可以管理对象,包括创建销毁对象等。在操作方面,又因为是个 IoC容器,因此可以把对象存进Spring或者从Spring中获取对象。

2> 法一,传递(存在依赖关系传对象)

//测试类
package demo2;
public class Test {
    //测试传对象 解耦合代码
    public static void main(String[] args) {
        Foundation foundation = new Foundation("xx号钢筋", "xx号水泥");
        Brick brick = new Brick(foundation, "xx号红砖");
        Beam beam = new Beam(brick, "杉木");
        House house = new House(beam);
        house.init();
    }
}

//House类
package demo2;
public class House {
    private Beam beam;
    public House(Beam beam){
        this.beam = beam;
    }
    public void init(){
        // 创建房子 依赖于挂房梁等操作
        beam.init();

        System.out.println("house: 房子建成");
    }
}

//Beam类
package demo2;
public class Beam {
    private Brick brick;
    private String material;

    public Beam(Brick brick, String material){
        this.brick = brick;
        this.material = material;
    }
    public void init(){
        // 挂房梁等 依赖于 砌好砖
        brick.init();

        System.out.println("Bean: 房梁木用 " + this.material);
    }
}

//Brick类
package demo2;
public class Brick {
    private Foundation foundation;
    private String redBrick;//红砖

    public Brick(Foundation foundation, String redBrick){
        // 砌砖 依赖于 已经打好地基
        this.foundation = foundation;
        this.redBrick = redBrick;//新增
    }
    public void init(){
        this.foundation.init();
        System.out.println("Brick: 砌砖用 " + this.redBrick);
    }
}

//Foundation类
package demo2;
public class Foundation {
    private String rebar;//钢筋
    private String cement;//水泥

    public Foundation(String rebar, String cement){
        this.rebar = rebar;
        this.cement = cement;
    }
    public void init(){
        System.out.println("Foundation: 打地基用 " + this.rebar +" "+ this.cement);
    }
}

运行结果:
在这里插入图片描述

3> 法二,使用Spring

具体操作,看后面的博客

Spring IoC 核心操作:

存对象 取对象

Spring IoC 优点:

解耦合
使用方便(不再需要手动创建对象)
更加高效(默认情况,使用相同类只需要创建一个对象)

2)什么是DI?

IoC,(Inversion of Control 控制反转)是一种设计原则,指的是将对象的创建和依赖关系交给容器来完成而不是由对象自己管理依赖对象。
DI,(Dependency Injection 依赖注入),是IoC的一种具体的实现方式,它是通过将依赖对象注入到对象中来实现对象之间的解耦。
简而言之,IoC是一种思想,而DI是IoC的一种具体实现方式

补充1:实现IoC除了DI之外,还需要控制反转容器(在Spring中就是Spring容器)和配置信息(xml文件,描述对象和依赖关系的元数据)。

补充2:① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩(在这里列出这种序号,需要的自取)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/864375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VBA_MF系列技术资料1-152

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…

沁恒ch32V208处理器开发(三)GPIO控制

目录 GPIO功能概述 CH32V2x 微控制器的GPIO 口可以配置成多种输入或输出模式,内置可关闭的上拉或下拉电阻,可以配置成推挽或开漏功能。GPIO 口还可以复用成其他功能。端口的每个引脚都可以配置成以下的多种模式之一: 1 浮空输入 2 上拉输入…

8年经验之谈 —— 35岁以上的测试开发工程师都去哪里了?

“测试开发工程师就是吃青春饭!” “35岁就是测试开发工程师的天花板,没有工作机会了。” “测试开发工程师趁早转行,不然迟早失业。” …… 网上对测试开发工程师不友好的言论非常多。真的是这样吗?如果不是这样,…

Cesium 1.107+ 自定义类支持 readyPromise

由于cesium 1.107 的图元(Primitive) 已经不支持 readyPromise。 但是个人感觉比较好用,于是用了一个插件来实现。 用法: // 定义图元并添加,和之前一样 const boxGreen new BoxPrimitive({color: "#ff0000" }) viewer.scene.primitives.add(boxGreen.primitive)/…

lazada、shopee店铺如何利用测评提高权重和排名?

在 lazada、shopee平台上开店后,卖家们必须对店铺的权重进行更多的关注。如果店铺的权重越高,那么它就会带来更多的流量和更多的订单,那么在 lazada、shopee平台上开设一家店铺,该怎样增加它的店铺权重和排名呢? laza…

算能BM1684X部署手写数字识别模型

大致流程--------------------------------------------------------------- 参考《sophon-sail_zh》 移植步骤------------------------------------------------------------------------ 首先搭建好自己的网络模型,并导出为onnx格式--具体可以参照--> GitH…

aspose 使用ftl模板生成word和pdf

1 先找到word模板,用${},替换变量,保存,然后另存为xml,最后把xml后缀改成ftl。 如下图: word 模板文件 ftl模板文件如下: 2 代码生成 下面函数将ftl填充数据,并生成word和pdf /*** * param dataMap 模板…

c++继承总结

一 继承的由来 我使用类也有一段时间了,慢慢觉得我们做一件事时,就是要先描述,例如写一个管理系统登记学校成员的信息,我们就要先对在学校内的老师和学生做描述,学生要有年龄,班级,姓名&#xf…

postman接口测试中文汉化教程

想必同学们对于接口测试工具postman的使用并不陌生,以及最近大为流行的国产工具apifox。对于使用过的同学来说,两者区别以及优缺点很容易别展示出来,postman相比apifox来说更加轻量,但是apifox更加符合国人的使用习惯....中国人给…

谷歌云 | BigQuery 现在支持用于查询开放表格式的清单文件

Cloud Ace 是谷歌云全球战略合作伙伴,拥有 300 多名工程师,也是谷歌最高级别合作伙伴,多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。 开放表格式依赖嵌…

C++:string类模拟实现

C:string类模拟实现 成员变量构造和析构容量相关1.获取容器大小(_size)和容量(_capacity)2.扩容(reserve)3.更改容器大小 修改相关1.尾插2.指定位置插入3.指定位置删除4.清空5.交换两个对象 比较相关访问相关迭代器相关查找相关其它成员函数1.截取子串2.取得C格式字…

交融动画学习

学习抖音&#xff1a; 渡一前端教科频道 利用 filter 的属性实现交融效果 变成 让后利用这个效果实现一个功能 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><style>* {margin: 0;…

c# .net mvc的IHttpHandler奇妙之旅--图片文件请求安全过滤,图片防盗链

在阅读该文章前,请先阅读该文章 c# .net mvc的IHttpHandler奇妙之旅。.net的生命周期和管道你听说过吗?你可以利用他处理业务如:跳转业务页面,文件请求的安全过滤,等等,还有许多神秘业务等着你去发现_橙-极纪元的博客-CSDN博客 该篇文章延续上面文章的第二小节《二、文件…

StarRocks企业级数据库

第1章 StarRocks简介 1.1 StarRocks介绍 StarRocks是新一代极速全场景MPP数据库 StraRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果&#xff0c;在业界实践的基础上&#xff0c;进一步改进优化、升级架构&#xff0c;并增添了众多全新功能&…

Cadence OrCAD Capture CIS批量替换GND符号的方法

🏡《总目录》   🏡《宝典目录》 目录 1,概述2,方法3,总结1,概述 如下图所示,有时由于绘图是从多个地方复制粘贴而来,一个图纸中会存在多种GND符号。此时比较容易引起GND网络名不同意的问题,为了避免该问题可对其批量替换。 2,方法 第1步:选择需要替换的GND符号…

【Nginx】Nginx的优化和防盗链

nginx版本迭代比较快 *工作中&#xff0c;在发版期&#xff0c;通常先备份文件并备注时间&#xff0c;方便后期故障后回档 例&#xff1a; cp nginx.conf nginx.conf.bak.2023.0805 隐藏版本号的两种方法*** 1.修改配置文件 vim /usr/local/nginx/conf/nginx.conf 在http模…

分享花店行业小程序平台搭建教程

随着移动互联网的快速发展&#xff0c;花店也开始意识到拥有一个专属的小程序能够提升用户体验、增加销售额。那么&#xff0c;如何快速搭建一个漂亮、实用的花店小程序呢&#xff1f;下面就为大家介绍一下具体的步骤。 第一步&#xff0c;使用第三方制作平台。如乔拓云网是一个…

Linux下C语言调用libcurl库获取天气预报信息

一、概述 当前文章介绍如何在Linux&#xff08;Ubuntu&#xff09;下使用C语言调用libcurl库获取天气预报的方法。通过HTTP GET请求访问百度天气API&#xff0c;并解析返回的JSON数据&#xff0c;可以获取指定城市未来7天的天气预报信息。 二、设计思路 【1】使用libcurl库进…

24届近5年南京大学自动化考研院校分析

今天给大家带来的是南京大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、南京大学 学校简介 南京大学是一所历史悠久、声誉卓著的高等学府。其前身是创建于1902年的三江师范学堂&#xff0c;此后历经两江师范学堂、南京高等师范学校、国立东南大学、国立第四中…