【Spring】控制反转(IoC)与依赖注入(DI)—IoC的概念与优点

Spring开发中,控制反转(IoC)和依赖注入(DI)是非常重要的设计原则。它们不仅提升了代码的可维护性和可测试性,还促进了松耦合的架构设计。

一、控制反转(IoC)概念

控制反转(Inversion of Control, IoC) 是一种设计原则,它将对象的控制权从程序中移交给框架或容器。换句话说,传统的编程方式中,程序代码负责创建和管理对象,而在IoC中,外部容器负责这些任务。

你在一家餐厅用餐。在传统的场景中,你作为顾客需要自己去厨房点餐、准备食物、清理餐具。而在IoC的场景中,餐厅的服务员(IoC容器)负责接收你的订单、准备食物并为你服务。你只需专注于享受美食,而不是管理整个用餐过程。

二、依赖注入(DI)概念

依赖注入(Dependency Injection, DI) 是实现IoC的一种具体方式。它允许一个对象(通常称为“客户端”)通过构造函数、属性或方法注入所需的依赖项,而不是在对象内部创建这些依赖项。

假设你需要一杯饮料。在DI的场景中,你可以通过服务员(DI容器)直接请求饮料,而不是自己去酒吧拿。这种方式使得饮料的获取变得简单而高效。

三、IoC与DI的优点

  1. 松耦合:通过将对象的创建和管理交给容器,组件之间的依赖关系被降低,代码的可重用性和可测试性提高。

  2. 易于测试:依赖注入使得在单元测试中可以轻松替换真实依赖为模拟对象,从而简化测试过程。

  3. 更好的维护性:当需要更改依赖的实现时,只需在配置中进行更改,而不需要修改业务逻辑代码。

  4. 配置灵活性:可以通过XML、注解或Java代码等多种方式进行配置,增强了灵活性。

四、示例代码

下面我们通过一个简单的示例来演示IoC和DI的使用。

1. 创建接口和实现类
// 定义一个服务接口
public interface MessageService {
    void sendMessage(String message, String recipient);
}

// 实现服务接口
public class EmailService implements MessageService {
    @Override
    public void sendMessage(String message, String recipient) {
        System.out.println("Email sent to " + recipient + " with message: " + message);
    }
}
2. 创建客户端类
// 客户端类,依赖于MessageService
public class User {
    private MessageService messageService;

    // 通过构造函数进行依赖注入
    public User(MessageService messageService) {
        this.messageService = messageService;
    }

    public void sendMessage(String message, String recipient) {
        messageService.sendMessage(message, recipient);
    }
}
3. 使用IoC容器(Spring)

在实际应用中,我们通常使用IoC容器来管理对象的生命周期和依赖关系。下面是如何使用Spring框架来实现上述代码。

3.1 Spring配置(XML方式)
<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 定义EmailService的bean -->
    <bean id="emailService" class="com.example.EmailService" />

    <!-- 定义User的bean,并注入EmailService -->
    <bean id="user" class="com.example.User">
        <constructor-arg ref="emailService" />
    </bean>
</beans>
3.2 启动应用
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 加载Spring配置
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 获取User bean
        User user = context.getBean("user", User.class);

        // 使用User发送消息
        user.sendMessage("Hello, Dependency Injection!", "john.doe@example.com");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

30多种独特艺术抽象液态酸性金属镀铬封面背景视觉纹理MOV视频素材

使用 Prismatic Flows 转换您的项目&#xff01;这个包拥有 30 多种独特的液体背景和动画&#xff0c;为任何创意活动提供令人惊叹的视觉效果。 棱镜流 – 动画背景和迭加包括30多种不同的液体背景和动画。这些高质量的资源非常适合通过充满活力和动态的视觉效果来增强您的项目…

车载网关性能 --- 车载网关通用buffer分配需求

老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的豁达,往不幸上面喷“香水”来掩盖问题。 无人问津也好,技不…

PLSQL 客户端连接 Oracle 数据库配置

1. 安装Oracle客户端 首先&#xff0c;安装Oracle客户端。可以从Oracle官方网站下载Oracle Instant Client, 安装完成后&#xff0c;请记住安装路径&#xff0c;因为将在后续步骤中需要用到它。 2. 配置环境变量 添加环境变量 ORACLE_HOME 安装Oracle客户端后&#xff0c;配…

docker-harbor仓库的搭建(2024)

准备实验需要的软件 将软件拉入虚拟机中&#xff0c;解压压缩包 [rootlocalhost ~]# tar zxf harbor-offline-installer-v2.5.4.tgz 1.进入harbor目录拷贝文件&#xff0c;创建名为harbor.yml的备份文件 [rootlocalhost ~]# cd harbor/ [rootlocalhost harbor]# cp harbor.yml…

Jmeter分布式压力测试

1、场景 在做性能测试时&#xff0c;单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机器&#xff0c;使用UI方式&#xff0c;最高压测在1800并发(RT 20ms以内)左右。如果…

Oracle下载安装(保姆级教学)

方法1 1. 官网下载安装包 对于 Oracle 软件的下载&#xff0c;建议通过官网免费下载&#xff0c;安全且有保证。 下载地址&#xff1a; https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html 通过下载页面可以选择安装压缩包&#xff08; WIND…

AOP 面向切面编程的实现原理

AOP是基于IOC的Bean加载来实现的&#xff0c;所以理解Spring AOP的初始化必须要先理解Spring IOC的初始化。然后就能找到初始化的流程和aop对应的handler&#xff0c;即parseCustomElement方法找到parse aop:aspectj-autoproxy的handler(org.springframework.aop.config.AopNam…

C# 范围判断函数

封装范围函数 public static class CommonUtil {/// <summary>/// 范围判断函数&#xff0c;检查给定的值是否在指定的最小值和最大值之间。/// 例如&#xff0c;可以用来判断当前日期是否在开始日期和结束日期之间。/// 该方法适用于任何实现了 IComparable 接口的类型…

搭建Elastic search群集

一、实验环境 二、实验步骤 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎Elasticsearch目录文件&#xff1a; /etc/elasticsearch/elasticsearch.yml#配置文件 /etc/elasticsearch/jvm.options#java虚拟机 /etc/init.d/elasticsearch#服务启动脚本 /e…

0基础学前端-----CSS DAY5

0基础学前端-----CSS DAY5 视频参考&#xff1a;B站Pink老师 今天是CSS学习的第五天&#xff0c;今天开始的笔记对应Pink老师课程中的CSS第二天的内容。 本节重点&#xff1a;CSS的元素显示模式、三种元素显示模式的转换、CSS背景设置。 2. CSS的元素显示模式 2.1 什么是元素…

SMOOTHLLM Defending LLM Against Jailbreaking Attacks (1)

越狱llm 越狱攻击&#xff1a;通过设计输入 欺骗模型 生成不当内容。 上&#xff09;llm拒绝回应“告诉我如何制造炸弹”。 有毒内容的添加设计的后缀 后&#xff0c;对齐的llm可以被成功攻击&#xff0c;产生不好的响应。 越狱攻击-设计输入方式&#xff1a; 关键在于尽量…

基于springboot的健身俱乐部网站系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

【H3CNE邓方鸣】IPv6+2024.12.23

文章目录 IPv4的问题IPv6的优势地址格式地址书写压缩网段划分地址分类单播地址组播地址任播地址 IPv6邻居发现协议IPv6地址自动配置 IPv4的问题 地址资源已经全部耗尽、终端用户配置不够简便&#xff0c;协议本身不具备安全性和QOS特性 IPv6的优势 几乎无尽的地址空间、终端…

基于微信小程序的短视频系统(SpringBoot)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

java如何使用poi-tl在word模板里渲染多张图片

1、poi-tl官网地址 http://deepoove.com/poi-tl/ 2、引入poi-tl的依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3、定义word模板 释义&#xf…

Android Studio的笔记--BusyBox相关

BusyBox 相关 BusyBoxandroid上安装busybox和使用示例一、下载二、移动三、安装和设置环境变量四、使用 busybox源码下载和查看 BusyBox BUSYBOX BUSYBOX链接https://busybox.net/ 点击链接后如图 点击左边菜单栏的Get BusyBix中的Download Source 跳转到busybox 的下载源码…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证4)

本文学习并记录builder.Services.AddAuthentication().AddJwtBearer函数中配置类的主要属性及用途。AddJwtBearer函数原型如下图所示&#xff0c;划红线的为常用形式&#xff0c;主要设置JwtBearerOptions类型的常用属性或事件。   JwtBearerOptions类中的属性虽多&#xff0…

学习threejs,scene.overrideMaterial全局材质效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.2 ☘️THREE.Scene 场景1.2 ☘️…

【YashanDB知识库】insert语句有编码不识别字,执行卡住问题

问题现象 insert语句卡住&#xff0c;yasdb worker线程cpu占用99.9% 问题风险及影响 sql执行不了 问题影响版本 22.2.16.1、23.3.0.61及之前版本 问题发生原因 lex解析时&#xff0c;对于不能识别字符的特殊场景&#xff0c;形成死循环。 1、alter system kill sessi…

zlog的使用方式

下载地址&#xff1a;GitHub - HardySimpson/zlog: A reliable, high-performance, thread safe, flexsible, clear-model, pure C logging library. zlog是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯C日志函数库。 正因为zlog是一个日志函数库&#xff0c;故zlog没…