【JavaEE】Spring + IoC + DI

news2024/12/25 23:50:38

目录

Spring概念

IoC

DI


Spring概念

Spring是包含众多工具方法IoC容器

IoC

IoC:Inversion of Control 控制权反转

        它是一种思想,是面向对象的一种设计原则。这种思想为了实现类与类之间的解耦

        比如当一个对象要使用另一个对象时,不再需要创建出来,而是直接从其他地方拿就              行

Spring IoC:

    是Spring框架的核心功能之一。它是一种设计模式,把对象的创建和管理的控制权反转给      容器。

        核心操作:存对象,取对象

        优点:解耦

                   使用方便,不再需要手动创建了,而是直接使用即可。

                   更加高效。

Spring IoC是IoC思想中的具体实现,

通过以下的代码来理解IoC: 

当前我们想简单的实现一辆车:由车身、底盘和轮胎组成。其中车身依赖底盘,底盘依赖轮胎

// 车
public class Car {
    // 车身
    private Body body;

    public Car() {
        body = new Body();
    }
    public void init() {
        System.out.println("车身造好了!");
        body.init();
    }
}
// 车身
public class Body {
    // 底盘
    private Bottom bottom;
    public Body() {
        bottom = new Bottom();
    }

    public void init() {
        System.out.println("底盘造好了!");
        bottom.init();
    }
}
// 底盘
public class Bottom {
    // 轮胎
    private Wheel wheel;

    public Bottom() {
        wheel = new Wheel();
    }
    
    public void init() {
        System.out.println("轮胎造好了!");
        wheel.init();
    }
}
// 轮子
public class Wheel {
    // 轮子大小统一为 15寸
    private int size = 15;

    public void init() {
        System.out.println("size : " + this.size);
    }
}
// 测试车
public class TestCar {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }
}

当轮胎尺寸大小固定不变的时候,这个代码正常运行。但是当要改变轮胎大小的时候,此时就会出现一个麻烦的事情:当轮胎变了,依赖轮胎的底盘要变,依赖底盘的车身要变,从而导致从下到上都要改动。修改部分代码如下:

由于每个类之间都是层层依赖的关系,并且都是本类创建出所需的类,然后使用。这就导致了,所有的代码都要大改动。而有了IoC的思想后,每个类对于所要使用的类,仅仅停留在使用阶段,不需要自己创建,直接从拿到注入给所需的类即可。修改代码如下:

// 轮子
public class Wheel {
    private int size = 15;

    public Wheel(int size) {
        this.size = size;
    }

    public void init() {
        System.out.println("size : " + this.size);
    }
}
// 底盘
public class Bottom {
    private Wheel wheel;
    
//  这里不是通过new来创建出轮胎,而是直接给底盘使用
//  这里可以看成从Spring容器中直接取(注入),但这不是Spring代码,可以看成这样的思想
//  后面的代码也都是这样改的
    public Bottom(Wheel wheel) {
        this.wheel = wheel;
    }

    public void init() {
        System.out.println("轮胎造好了!");
        wheel.init();
    }
}
// 车身
public class Body {
    private Bottom bottom;

    public Body(Bottom bottom) {
        this.bottom = bottom;
    }

    public void init() {
        System.out.println("底盘造好了!");
        bottom.init();
    }
}
// 车
public class NewCar {
    private Body body;

    public NewCar(Body body) {
        this.body = body;
    }

    public void init() {
        System.out.println("车身造好了!");
        body.init();
    }
}
public class TestNewCar {
    public static void main(String[] args) {
//        这里目前写起来是非常复杂的,如果是Spring项目的话,
//        存储了这些对象后,想拿到是很简单的
        Wheel wheel = new Wheel(18);
        Bottom bottom = new Bottom(wheel);
        Body body = new Body(bottom);
        NewCar newCar = new NewCar(body);
        newCar.init();
    }
}

DI

Dependence Injection  注入依赖

上面提到了IoC,它是一种反转控制权思想,而DI则是它的实现方式。

它从Spring容器中取出已经注册的对象,比如上面的车身、底盘和轮胎,哪个类需要,直接从容器中取出使用即可。

在Spring框架中,DI通过@Autowire注解、构造函数注入、Setter方法注入等方式来实现。其中,@Autowire注解是最常用的方式,它可以自动装配对象,并且可以根据类型、名称、注解等条件进行注入。


有什么错误评论区指出。希望可以帮到你。

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

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

相关文章

IO流相关知识

IO流 1.文件 保存数据的地方 2.文件流 文件在程序中以流的形式来操作的 流:数据在数据源(文件)和程序(内存)之间的经历的路程 输入流:数据从数据源(文件)到程序(内存…

【FPGA-DSP】第五期:FFT调用流程

目录 1. matlab输入信号编写 2. Simulink开发 2.1 模块搭建 2.2 Simulink运行 2.3 matlab信号处理 拓:输入信号位数改变 本章节主要说明如何在system generator中使用fft模块,话不多说,看操作: 参考教程第5期 - FFT调用流…

PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor

前言: 本文主要介绍了如何使用Python VTK高亮显示actor,使用Python语言,高亮显示选中的actor。当窗口中的圆球actor被选中时,会变成红色,并且会显示actor三遍面片边缘信息。 效果: VTK VTK,&…

Linux常见实用操作汇总(带示例版)

Linux常见实用操作汇总 1、各类快捷键1.1 强制停止1.2 退出、登出1.3 历史命令搜索1.4 光标移动1.5 清屏 2、软件安装2.1 在CentOS系统中,使用yum命令联网管理软件安装2.2 在Ubuntu系统中,使用apt命令联网管理软件安装。 3、systemctl4、软连接5、日期和…

Golang每日一练(leetDay0036) 二叉树专题(5)

目录 106. 从中序与后序遍历序列构造二叉树 Construct-binary-tree-from-inorder-and-postorder-traversal 🌟🌟 107. 二叉树的层序遍历 II Binary Tree Level-order Traversal II 🌟🌟 108. 将有序数组转换为二叉搜索树 C…

Nginx配置ssl证书实现https安全访问

目录 一、Nginx的安装与配置 安装步骤 二、SSL证书获取 三、Nginx配置 前题条件,拥有服务器与可以解析到该服务器的自己的域名。 一、Nginx的安装与配置 若已安装好了Nginx,则需查看自己的Nginx是否开启了SSL的模块功能: ./nginx -V 显…

多媒体信息发布系统解决方案

1.系统概述 多媒体信息发布系统主要是一个用于发布各种信息的平台,包括文字、图片、音频和视频等多种形式的信息。该系统旨在满足用户的信息需求,为信息发布者提供一个高效、安全、可靠的信息发布平台。 2.系统模块 (1)用户管理…

爬虫攻守道 - 猿人学第20题 - 殊途同归

写在开头 这题也是,自己搞顶多追踪到wasm代码,然后就走不下去了。找了2个参考方案,自己做的过程中还又遇到些新的问题,下面做个记录。解法1参考文章解法2参考文章 解法1:追根溯源 在 JS 代码中追踪到 Payload 赋值位…

漂亮实用的15个脑图模板,你知道哪些是AI做的吗?

对于很多第一次接触到思维导图的朋友,看到软件的时候往往找不到方向,不知道如何创作? 今天大家的好助手来了。 一是有大量的思维导图模板,大家看着模板做,慢慢就会做了。 二是ProcessOn 思维导图已经可以用AI 做思维…

鏖战大模型,未必能拯救商汤

在不被资本市场看好的质疑声中,商汤科技于近日跟风推出了自己的大模型产品,而且还直接打造了一个大模型超市,声称包括CV(计算机视觉)、NLP(​​​​​​​自然语言处理)、AIGC(人工智…

新电脑如何增加c盘空间

刚到手的台式机,发现C盘只分配了 100G 空间,对于我来说是不太够的(安装的软件太多,即使是一点点数据,几年就达到100G了)。对于经常不选择软件安装路径,全部都装在C盘的人,也是不够的…

【致敬未来的攻城狮计划】— 连续打卡第五天:Keil配置使用(使用 RASC 生成 Keil 工程)

系列文章目录 1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 文…

8万字智慧旅游景区信息化建设方案word

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 1.1. 整体建设框架 XXXXXX智慧景区旅游建设对于全面整合景区旅游资源,提升景区旅游产业发展能级,进一步增强景区旅游业的核心竞争力具有十分重要的支…

拷贝、原型原型链

浅拷贝 将原对象或原数组的引用直接赋给新对象,新数组 新对象只是对原对象的一个引用,而不复制对象本身。新旧对象还是共享同一块内存 如果属性是一个基本数据类型,拷贝的就是基本数据类型的值 如果属性是引用类型,拷贝的是内…

Oracle的学习心得和知识总结(二十)|Oracle数据库Real Application Testing之DBMS_SQLTUNE包技术详解

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

SRv6项目实践(二):基本的P4框架

1.数据包头的定义 在实现SRv6之前,有很多的工作需要做,首先先阅读一下p4的代码总体框架,数据包的包头格式一共有如下这些,我们需要把他们的协议逐一完善 struct parsed_headers_t {cpu_out_header_t cpu_out;cpu_in_header_t cpu_in;ethern…

PostgreSQL环境搭建和主备构建

目录 1 Windows 上安装 PostgreSQL2 docker安装PostgreSQL2.1 检索当前镜像2.2. 拉取当前镜像2.3 创建挂载文件夹2.4 启动镜像2.5 查看日志2.7 查看进程2.8 使用连接 3 postgresql主从主备搭建3.1 安装好网络源(主1.11、从1.12)3.2 安装postgresql&#…

(数字图像处理MATLAB+Python)第五章图像增强-第二节:基于直方图修正的图像增强

文章目录 一:灰度直方图(1)定义(2)程序(3)性质 二:直方图修正法理论三:直方图均衡化(1)直方图均衡化变换函数T(r)的求解(2&#xff09…

设计模式-创建型模式之简单工厂模式( Simple Factory Pattern )

1.创建型模式简介创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整…

HCIP之MPLS中的LDP协议

LDP协议 LDP协议 --- 标签分发协议 MPLS控制层面需要完成的工作主要就是分配标签和传递标签。分配标签的前提是本地路由表中得先存在标签,传递标签的前提也是得先具备路由基础。所以,LDP想要正常工作,则需要IGP作为基础。 LDP协议主要需要完…