Java | Spring框架 | 核心概念

devtools/2024/10/21 7:37:28/

控制反转(IoC)与依赖注入(DI):轻松管理对象依赖

一、理解IoC和DI

  • 控制反转(IoC)是一种设计原则,它通过将控制权从程序代码转移到外部容器来降低计算机代码之间的耦合关系。在传统的程序设计中,我们通常在代码中直接创建对象实例,但在IoC模式中,对象实例的创建和生命周期管理由外部容器负责。这种模式使得代码更加模块化,易于管理和测试。
  • 依赖注入(DI)是实现IoC的一种方式。在DI模式中,依赖关系(即对象需要的其他对象)通过外部注入,而不是在对象内部创建。这意味着对象不需要知道如何获取或创建它们依赖的其他对象,它们只需提供一种方式来接收这些依赖。

二、IoC和DI的好处

  • 降低耦合度:通过将对象创建和依赖关系的管理外部化,降低了组件之间的耦合度。
  • 提高模块化:使得组件更加独立,易于理解和测试。
  • 增强可扩展性:可以更容易地替换组件的实现,而无需修改依赖组件的代码。
  • 简化配置和部署:通过外部容器管理对象生命周期和依赖关系,简化了配置和部署过程。
demo:

假设我们有一个MessagePrinter类,它依赖于MessageService类来获取消息。在传统的编程方式中,我们会在MessagePrinter类内部创建MessageService的实例。但在Spring的IoC和DI模式下,我们会将MessageService的实例通过外部注入到MessagePrinter中。

MessageService接口

// MessageService.java
public interface MessageService {String getMessage();
}

实现MessageService的类

// HelloWorldService.java
public class HelloWorldService implements MessageService {@Overridepublic String getMessage() {return "Hello, World!";}
}

依赖MessageService的类

// MessagePrinter.java
public class MessagePrinter {private MessageService service;// 依赖注入public MessagePrinter(MessageService service) {this.service = service;}public void printMessage() {System.out.println(service.getMessage());}
}

配置类

// AppConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MessageService helloWorldService() {return new HelloWorldService();}@Beanpublic MessagePrinter messagePrinter() {return new MessagePrinter(helloWorldService());}
}

主类

// MainApp.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MainApp {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);MessagePrinter printer = context.getBean(MessagePrinter.class);printer.printMessage(); // 输出: Hello, World!}
}

在这个例子中,MessagePrinter类依赖于MessageService接口。这个依赖不是在MessagePrinter类内部创建的,而是通过AppConfig类的helloWorldService方法注入的。这种方式使得MessagePrinter与HelloWorldService的具体实现解耦,提高了代码的灵活性和可测试性。

三、区别

  1. 传统方式:在传统的程序设计中,对象A直接创建对象B的实例。
  2. IoC和DI方式:在IoC和DI方式中,对象A不直接创建对象B的实例,而是由外部容器负责创建对象B的实例并将其注入到对象A中。

四、AI时代的游轮已经到来

如果你觉得开发过程中存在重复性工作,效率不够高。

不妨看看影子的AI+编程玩法,涵盖了Java | AI+编程的学习资料,助力每一位编程人员提高效率,无论你是在校学生或是工作者,都应为未来的AIG时代做准备。

AI编程学习资料icon-default.png?t=N7T8https://blog.csdn.net/yingzix688/article/details/137894050


http://www.ppmy.cn/devtools/32247.html

相关文章

Vue3深度解析:掌握define系列API,构建高效组件体系

一、defineComponent defineComponent是Vue3中用来定义一个标准组件的主要方式,它接受一个选项对象作为参数,这个对象可以包含组件的模板、数据、方法、生命周期钩子等属性。 import { defineComponent } from vue;export default defineComponent({//…

[iOS]APP优化

一、性能优化 性能优化是一个至关重要的过程,它对提高应用的用户体验、增强应用的市场竞争力以及维持用户的长期参与度具有深远的影响。 1.CPU 使用优化 工具:Instruments (Time Profiler)使用方法:利用 Xcode 的 Instruments 工具中的 Ti…

【人工智能AI书籍】TensorFlow机器学习实战指南(推荐)

今天又来给大家推荐一本人工智能方面的书籍<TensorFlow机器学习实战指南>。TensorFlow是一个开源机器学习库。本书从TensorFlow的基础开始介绍&#xff0c;涉及变量、矩阵和各种数据源。之后&#xff0c;针对使用TensorFlow线性回归技术的实践经验进行详细讲解。后续章节…

kubectl_入门_Pod控制器

Pod控制器 在k8s中&#xff0c;按照pod的创建方式可以将其分为两类 自主式pod&#xff1a;k8s直接创建出来的pod&#xff0c;这种pod删除后就没有了&#xff0c;也不会重建控制器创建的pod&#xff1a;通过控制器创建的pod&#xff0c;这种pod删除了之后还会自动重建 1. 什么…

strncat的使用及其模拟实现

一、什么是strncat strncat是一个C标准库函数&#xff0c;用于将一个字符串的一部分追加到另一个字符串的末尾。 strncat的语法格式&#xff1a; char *strncat(char *dest, const char *src, size_t n); 其中&#xff1a; dest是目标字符串&#xff1b;src是源字符串&…

云HIS系统全套源码:采用Angular+Nginx+Java+Spring,SpringBoot技术开发(开箱即用)

​ 医院信息管理系统HIS包括门&#xff08;急&#xff09;诊管理、住院管理、药库&#xff08;房&#xff09;管理、门诊电子处方、住院医嘱管理、电子病历、护理文书、病案管理等多个管理模块&#xff0c;涵盖了医疗信息管理的各个业务环节。在全院联网的基础上&#xff0c;把…

OpenCV的图像矩(64)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何为等值线创建边界旋转框和椭圆(63) 下一篇 &#xff1a;OpenCV4.9的点多边形测试(65) Image Moments&#xff08;图像矩&#xff09;是 OpenCV 库中的一个功能&#xff0c;它可…

vue的action与mutation 的区别

在 Vue.js 的状态管理库 Vuex 中&#xff0c;mutations 和 actions 都是用于更改状态的方法&#xff0c;但它们之间存在一些重要的区别。下面我将通过举例来说明这些区别&#xff1a; 1. 基本定义 mutations&#xff1a;用于直接修改状态&#xff08;state&#xff09;。它们是…