Spring和其IOC和DI

news2024/9/23 5:21:09

spring是干什么的?

Spring 是一个开源的Java应用程序框架,最初由Rod Johnson在2003年创建。Spring 的初衷是为了简化企业级Java应用程序的开发,并提供一种灵活、可扩展、易于测试和维护的编程模型。

 

先来看看Spring 框架诞生的初衷:

  1. 简化开发:Spring 提供了一个轻量级的容器,它可以管理和组装应用程序中的对象(称为IoC容器),使开发人员能够更加专注于业务逻辑层的开发,而不需要过多关注底层的复杂性。

  2. 提升可测试性:Spring 框架设计时考虑了可测试性,它支持依赖注入(DI)和面向接口编程,使得应用程序的各个组件能够方便地进行单元测试和集成测试。

  3. 促进松耦合:Spring 采用了松耦合的设计思想,通过依赖注入和面向接口编程,将组件之间的依赖关系从代码中解耦出来,降低了组件之间的耦合度,使得代码更加灵活、可复用和可维护。

  4. 支持面向切面编程(AOP):Spring 提供了对面向切面编程的支持,可以在不改变原有业务逻辑的情况下,通过切面将横切关注点(如事务管理、日志记录等)与核心业务逻辑进行解耦,提高了代码的模块化和复用性。

  5. 丰富的功能扩展:Spring 框架提供了众多的可插拔的功能模块,如数据访问、事务管理、安全认证、Web开发等,开发人员可以根据需求灵活地选择和集成相应的模块,以满足不同应用的需求。

总的来说,Spring 的初衷是为了提供一种简化开发、增强可测试性、促进松耦合和支持面向切面编程的编程模型,以帮助开发人员构建可靠、可扩展和易于维护的企业级Java应用程序。

spring框架的模型:

当我们谈论Spring框架时,可以将其比喻为一个大型的工具箱。这个工具箱里包含了不同的模块,每个模块都有自己特定的功能,但它们又可以相互协作。

比如说:

        Core模块就是这个工具箱的核心部分,它负责控制整个Spring框架的执行流程和管理各个组件。类似于工人在使用工具箱时,会先从里面拿出一个最基本的工具。

        AOP模块就像是给这个工具箱加上了一个增强器,它允许我们将一些通用的操作(比如日志记录、性能监控)独立出来,以切面的方式应用到我们的应用程序中。就好比我们在使用工具箱时,有一个能够自动进行某些处理的工具。

        DAO模块则是对JDBC进行封装的工具,它使得我们能够更方便地访问数据库,并提供了事务管理的能力。就像在工具箱中放了一个专门处理连接和查询数据库的工具。

        ORM模块则提供了对常见的ORM框架(比如Hibernate)的支持,使得我们能够更轻松地操作数据库对象。可以把它想象成一个适配器,将数据库和应用程序之间的数据转换工作交给它来完成。

        Context模块就像是整个工具箱的管家,负责管理各个组件和资源。它提供了一种框架式的访问方式,使得我们可以方便地获取和管理Spring中的Bean对象。此外,它还提供了其他功能,如国际化、事件传播和验证。

        Web模块是建立在Context模块之上的,它专注于为Web应用程序提供支持。它可以与其他Web框架(比如Struts、JSF)进行集成,提供了一个适合Web开发的环境。

        Web MVC模块则是这个工具箱中的一个特殊工具,它专门用于构建Web应用程序中的MVC架构。它提供了各种功能和视图技术,帮助我们构建出功能完善的Web应用程序。

        可以说Spring框架就像一个功能强大的工具箱,里面包含了各种各样的工具模块,用来简化我们的开发过程,并提供了丰富的功能和支持。这些模块相互协作,让我们能够更高效、更方便地开发应用程序。

Spring的IOC和DI到底是为了什么?

在Spring框架中,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是紧密相关的概念。它们都是为了解决组件之间的依赖关系管理问题,提高代码的灵活性、可复用性和可测试性。

  1. 控制反转(IOC):IOC 是一种设计思想,它将对象的创建和管理工作交给了框架来完成,而不是由开发人员手动管理。传统上,对象的创建通常通过直接实例化或使用工厂模式来完成,而在IOC中,开发人员只需要定义对象所需的依赖关系,并将控制权交给框架。框架会负责创建对象、管理对象的生命周期,并将对象提供给需要它们的地方。

  2. 依赖注入(DI):DI 是实现IOC的具体方式之一。它是指通过构造函数、setter方法或接口注入等方式,将一个对象所需要的依赖关系注入到对象中。开发人员只需要声明对象所需的依赖,而不需要关心如何创建和提供这些依赖,框架会自动进行依赖的注入。这样,对象之间的耦合度就被降低了,同时也使得代码更加灵活、可扩展和易于测试。

因此,IOC和DI可以被视为一种编程模型,旨在解耦对象之间的依赖关系,并将对象的创建和管理工作交给框架来处理。通过将控制权反转给框架,并使用依赖注入的方式,开发人员可以更加专注于业务逻辑的实现,而不需要过多关注对象的创建和管理细节。这样可以提高代码的可维护性、可测试性,以及整体应用程序的灵活性和扩展性。

控制反转(IOC)和依赖注入(DI)的优点

好处:

使用控制反转(IOC)和依赖注入(DI)的好处如下:

  1. 解耦对象之间的依赖关系:传统的对象创建方式中,对象通常需要直接实例化或使用工厂模式来创建。这样会导致对象之间紧密耦合,难以复用和测试。而采用IOC和DI的方式,可以将对象之间的依赖关系解耦,降低它们之间的耦合度。

  2. 提高代码的灵活性和可维护性:通过IOC和DI,开发人员只需要声明对象所需的依赖关系,而不需要亲自负责对象的创建和管理。这样可以使代码更加灵活,易于修改和扩展。同时,将对象的创建和管理交给框架来处理,可以提高代码的可维护性,减少重复代码的编写。

  3. 支持单元测试和集成测试:使用IOC和DI可以方便地进行单元测试和集成测试。由于对象的依赖关系被解耦,可以轻松地用模拟对象替代真实的依赖对象进行测试,从而更容易编写和执行单元测试和集成测试。

  4. 促进代码的可扩展性:通过IOC和DI,可以方便地替换和切换依赖对象。当需求变化时,只需要修改配置文件或注解,而不需要改动源代码。这样可以提高代码的可扩展性,减少对现有代码的影响。

总结来说,使用控制反转和依赖注入可以解耦对象之间的依赖关系,提高代码的灵活性、可维护性和可测试性。它们使得开发人员更加专注于业务逻辑的实现,而不需要过多关注对象的创建和管理细节。这样可以提高开发效率,降低代码的复杂性,并促进代码的可扩展性和可重用性。

 IOC和DI=》举个例子:

举个例子来说明控制反转(IOC)和依赖注入(DI)的作用。

假设我们正在开发一个简单的图书管理系统,其中有以下几个类:`Book`(表示图书)、`Library`(表示图书馆)和 `LibraryService`(提供图书管理的服务)。

在没有使用IOC和DI的情况下,我们可能会在 `LibraryService` 类中直接实例化 `Book` 和 `Library` 对象:


public class LibraryService {
    private Book book;
    private Library library;
    
    public LibraryService() {
        this.book = new Book();
        this.library = new Library();
    }
    
    // 省略其他方法
}

这样做的问题是,在 `LibraryService` 类中直接创建 `Book` 和 `Library` 对象,导致 `LibraryService` 类与 `Book` 和 `Library` 类紧密耦合在一起。如果后续需要修改 `Book` 或 `Library` 的实现方式,就需要修改 `LibraryService` 类的代码,违背了开闭原则。

现在,我们使用IOC和DI来改造上述代码,通过将对象的创建和管理交给框架来处理。

首先,创建 `Book` 和 `Library` 类,它们的实例将从外部注入到 `LibraryService` 类中:


public class Book {
    // 省略属性和方法
}

public class Library {
    // 省略属性和方法
}

public class LibraryService {
    private Book book;
    private Library library;
    
    public LibraryService(Book book, Library library) {
        this.book = book;
        this.library = library;
    }
    
    // 省略其他方法

接下来,在应用程序的配置文件或使用框架提供的注解方式,配置对象的依赖关系:


<!-- 配置对象的依赖关系 -->
<bean id="book" class="com.example.Book" />
<bean id="library" class="com.example.Library" />
<bean id="libraryService" class="com.example.LibraryService">
    <constructor-arg ref="book" />
    <constructor-arg ref="library" />
</bean>

或者使用注解方式:


@Component
public class Book {
    // 省略属性和方法
}

@Component
public class Library {
    // 省略属性和方法
}

@Component
public class LibraryService {
    private Book book;
    private Library library;
    
    @Autowired
    public LibraryService(Book book, Library library) {
        this.book = book;
        this.library = library;
    }
    
    // 省略其他方法

这样,框架会负责根据配置文件或注解,在创建 `LibraryService` 对象时自动注入 `Book` 和 `Library` 对象,使得它们之间的依赖关系解耦,并且不需要修改 `LibraryService` 类的代码。

通过使用IOC和DI,我们将对象的创建和管理交给了框架,降低了对象之间的耦合度,使代码更加灵活、可维护和可测试。当需要修改 `Book` 或 `Library` 的实现方式时,只需要调整配置文件或注解,而不需要修改 `LibraryService` 类的代码,这符合开闭原则,并且提高了代码的可扩展性和可重用性。

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

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

相关文章

如何从Pytorch中导出ONNX模型并使用它实现图像超分

前言 在本教程中&#xff0c;我们将介绍如何将 PyTorch 中定义的模型转换为 ONNX 格式&#xff0c;然后使用 ONNX 运行时运行它。 ONNX 运行时是面向 ONNX 模型的以性能为中心的引擎&#xff0c;可跨多个平台和硬件&#xff08;Windows、Linux 和 Mac&#xff09;以及 CPU 和 G…

Qlik Sense Desktop安装配置

Qlik Sense 是一种数据可视化分析的产品&#xff0c;允许从多个数据原进行数据读取并进行分析。而Qlik Sense Desktop作为桌面端的解决方案&#xff0c;为用户提供可视化创建、交互数据可视化、报告和仪表板等功能&#xff0c;目前只支持Windows系统。 注意&#xff1a;事先需要…

设计模式、Java8新特性实战 - List<T> 抽象统计组件

一、背景 在日常写代码的过程中&#xff0c;针对List集和&#xff0c;统计里面的某个属性&#xff0c;是经常的事情&#xff0c;针对List的某个属性的统计&#xff0c;我们目前大部分时候的代码都是这样写&#xff0c;每统计一个变量&#xff0c;就要定义一个值&#xff0c;且…

C++、python双语言弹窗教程与对比

Messagebox弹窗 MessageBox指的是显示一个模态对话框&#xff0c;其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息&#xff0c;如状态或错误的信息。消息框中返回一个整数值&#xff0c;该值指示用户单击了哪个按钮。 例子&#xff1a; 本文介绍了用C、Pytho…

STM32基础入门学习笔记:核心板 电路原理与驱动编程

文章目录&#xff1a; 一&#xff1a;LED灯操作 1.LED灯的点亮和熄灭 延迟闪烁 main.c led.c led.h BitAction枚举 2.LED呼吸灯&#xff08;灯的强弱交替变化&#xff09; main.c delay.c 3.按键控制LED灯 key.h key.c main.c 二&#xff1a;FLASH读写程序(有…

数据安全能力框架模型-详细解读(二)

数据安全能力框架构成 1&#xff09; 数据安全治理 管理视角&#xff1a;从组织制度流程上提出要求&#xff0c;由于数据在各业务系统之间流转&#xff0c;需要设立高级管理层参与决策的数据安全管理部门&#xff0c;统筹和规划多部门之间的工作&#xff1b;需要设立跨组织的…

34.利用matlab解 多变量多目标规划问题(matlab程序)

1.简述 学习目标&#xff1a;适合解 多变量多目标规划问题&#xff0c;例如 收益最大&#xff0c;风险最小 主要目标法&#xff0c;线性加权法&#xff0c;权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) &#xff1b; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…

RabbitMQ 备份交换机和死信交换机

为处理生产者生产者将消息推送到交换机中&#xff0c;交换机按照消息中的路由键即自身策略无法将消息投递到指定队列中造成消息丢失的问题&#xff0c;可以使用备份交换机。 为处理在消息队列中到达TTL的过期消息&#xff0c;可采用死信交换机进行消息转存。 通过上述描述可知&…

c高级day2shell指令

一编程语言 编程语言面向过程c面向对象c编译型语言c\c解释性语言shell脚本\python 需要解析器 二shell脚本 2.1操作系统的结构 应用层:app\代码 应用层通过shell解析器完成和内核层的交互 --------------------------------------- 内核层:内核的五大功能:1、设…

Django的FBV和CBV

Django的FBV和CBV 基于django开发项目时&#xff0c;对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV&#xff0c;function base views&#xff0c;其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…

SIT3232E——高静电防护 3.3V 单电源供电双通道 RS232 收发器,可替代MAX3232

SIT3232E 是一款 3.0V~5.5V 供电、双通道、低功耗、高静电防护 ESD 保护&#xff0c;完全满足 TIA/EIA-232 标准要求的 RS-232 收发器。 SIT3232E 包括两个驱动器和两个接收器&#xff0c;具有增强形 ESD 保护功能&#xff0c;达到 15kV 以上 HBM ESD 、 8kV …

64 # 实现一个 http-server

准备工作 上一节实现了通过 commander 的配置获取到用户的参数&#xff0c;下面完成借用 promise 写成类的方法一节没有完成的任务&#xff0c;实现一个 http-server&#xff0c;https://www.npmjs.com/package/http-server&#xff0c;http-server 是一个简单的零配置命令行静…

centos7 yum安装mysql5.7

卸载mysql 以下指令查看是否安装过 rpm -qa | grep -i mysql 如果发现已经安装&#xff0c;需要卸载了再安装&#xff08;据说&#xff0c;这样的卸载是不彻底的。&#xff09; rpm -e mysql 卸载 mariadb yum -y remove mariadb-libs-1:5.5.68-1.el7.x86_64 下载和安装mys…

Liunx:进程

冯诺依曼体系结构: 目前我们使用的计算机,包括笔记本,台式电脑,或者后端服务器,都是一堆硬件的集合,他们不是无序的组合在一起,首先它们要有协同能力,要求它们有协同能力,这就意味着它们之间一定要组织好,构成一个系统,他们才能对外输出,提供计算服务. 当代计算机都是由冯诺依曼…

漏洞扫描工具-goby(九)

什么是Goby&#xff1f; Goby是一款基于网络空间测绘技术的新一代网络安全工具&#xff0c;它通过给目标网络建立完整的资产知识库&#xff0c;进行网络安全事件应急与漏洞应急。 Goby可提供最全面的资产识别&#xff0c;目前预置了超过10万种规则识别引擎&#xff0c;能够针对…

Unity CanvasGroup组件

文章目录 1. 简介2. 组件属性2.1 Alpha(透明度)2.2 Interactable(是否为可交互)2.3 Blocks Raycasts(是否接受射线监测)2.4 Ignore Parent Groups(忽视上层的画布组带来的影响) 1. 简介 CanvasGroup(画布组) 组件&#xff0c;可集中控制整组 UI 元素(自身和所有子物体)的某些属…

Microsoft Message Queuing Denial-of-Service Vulnerability

近期官方公布了一个MSMQ的拒绝服务漏洞&#xff0c;可能因为网络安全设备的更新&#xff0c;影响业务&#xff0c;值得大家关注。 漏洞具体描述参见如下&#xff1a; Name: Microsoft Message Queuing Denial-of-Service Vulnerability Description: Microsoft Message Queuing…

jar命令的安装与使用

场景&#xff1a; 项目中经常遇到使用WinR软件替换jar包中的文件&#xff0c;有时候存在WinRAR解压替换时提示没有权限&#xff0c;此时winRAR不能用还有有什么方法替换jar包中的文件。 方法&#xff1a; 使用jar命令进行修改替换 问题&#xff1a; 执行jar命令报错jar 不…

Macbook恢复出厂设置2023详细步骤

Macbook随着用户的使用时间增长&#xff0c;文件的不断添加和各种应用程序的安装之后可能会开始变得迟缓卡顿&#xff0c;这时候选择将设备还原为默认出厂设置可以有效的解决Macbook的使用卡顿以及缓慢的问题。那么Macbook怎么恢复出厂设置?Macbook如何恢复出厂设置?一起来了…

【雕爷学编程】MicroPython动手做(37)——驱动LCD与图文显示4

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…