IOC控制反转

IOC

        IOC,全称为Inversion of Control(控制反转),是一种设计原则,它反转了传统编程中的控制流程。在传统的编程模式中,组件之间的依赖关系是由组件自身在内部创建和维护的。而在控制反转模式中,这种依赖关系由外部容器(如Spring框架)来管理,组件不再负责自己的依赖,而是通过外部容器来注入所需的依赖。

控制反转的概念

        控制反转的核心思想是将对象的创建和它们之间的依赖关系管理从对象本身转移到外部容器。这样做的好处是:

  1. 降低耦合度:组件之间的依赖关系不再是硬编码的,因此可以更容易地更换组件实现,提高系统的灵活性和可维护性。
  2. 提高模块化:各个组件可以独立开发和测试,因为它们不依赖于具体的实现,而是依赖于抽象的接口或抽象类。
  3. 便于测试:由于组件之间的依赖被外部化,可以更容易地使用mock对象或测试桩来模拟依赖进行单元测试。

控制反转的实现方式

        控制反转可以通过以下几种方式实现:

  1. 依赖注入:这是最常见的实现方式,容器在运行时将组件所需的依赖注入到组件中。
  2. 服务定位器模式:组件不直接创建依赖,而是通过一个服务定位器来查询依赖对象。服务定位器负责管理依赖对象的创建和生命周期。
  3. 工厂模式:通过工厂类来创建对象,而不是直接在组件中创建。工厂类负责对象的创建和依赖关系的管理。

Spring框架中的IOC容器

        Spring框架是一个实现了控制反转原则的轻量级容器,它提供了一个中央容器来管理所有组件的创建、配置和依赖关系。Spring的IOC容器主要通过以下几个步骤来实现控制反转:

  1. 配置元数据:通过XML配置文件、注解或Java配置类来定义组件的元数据。
  2. 容器启动:Spring容器启动时,会读取配置元数据,并根据这些信息创建和配置组件。
  3. 依赖注入:容器根据配置的依赖关系,通过构造器注入、Setter注入等方式,将依赖注入到组件中。
  4. 应用上下文:Spring容器充当应用上下文的角色,管理所有组件的生命周期和依赖关系。
  5. 懒加载和预加载:Spring容器可以配置为懒加载(按需加载)或预加载(启动时加载)组件。

优点和缺点如下:

        优点:

  1. 解耦:组件之间的耦合度降低,提高了模块化。
  2. 可维护性:组件更容易替换和维护
  3. 可测试性:依赖可以被mock或替换,便于单元测试。
  4. 灵活性:可以灵活地配置和扩展系统

        缺点:

  1. 复杂性:引入了额外的容器和配置,增加了系统的复杂性。
  2. 性能开销:可能会有轻微的性能开销,尤其是在容器启动和依赖注入时
  3. 过度设计:在一些简单的项目中,控制反转可能被视为不必要的复杂性。

IOC实践

        控制反转(IOC)的一个典型例子是在Spring框架中使用依赖注入(DI)来管理对象的生命周期和依赖关系。下面我将通过一个简单的例子来展示IOC的使用,并在博客当中提供相应的代码。

        假设我们有一个简单的日志服务,它依赖于一个日志记录器。在传统的编程模式中,日志服务可能会自己创建日志记录器的实例。使用Spring的IOC,我们可以将日志记录器的创建和管理交给Spring容器。

代码结构与Spring应用上下文如下:

日志记录器接口和实现

public interface Logger {void log(String message);
}public class ConsoleLogger implements Logger {@Overridepublic void log(String message) {System.out.println("Logging to console: " + message);}
}

需要日志服务的业务组件

public class BusinessService {private Logger logger;// 通过构造器注入public BusinessService(Logger logger) {this.logger = logger;}public void doBusiness() {logger.log("Business operation performed.");// 执行业务逻辑}
}

配置Spring容器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic Logger logger() {return new ConsoleLogger();}@Beanpublic BusinessService businessService(Logger logger) {return new BusinessService(logger);}
}

启动Spring应用上下文并使用业务组件

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Application {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);BusinessService businessService = context.getBean(BusinessService.class);businessService.doBusiness();}
}

BusinessService 需要一个 Logger 来记录日志。通过Spring的IOC容器,我们不需要在 BusinessService 中创建 Logger 的实例,而是通过配置类 AppConfig 来告诉Spring如何创建这些Bean,以及它们之间的依赖关系。当 Application 类启动时,它创建了一个Spring应用上下文,从中获取 BusinessService 的实例,并调用它的 doBusiness 方法。Spring容器负责注入Logger 的实例到 BusinessService 中,这样就实现了控制反转。

结论

        控制反转是一种重要的设计原则,它通过将控制权从组件转移到外部容器,提高了系统的灵活性和可维护性。Spring框架是实现控制反转的典型例子,它提供了一个强大的I0C容器来管理组件的生命周期和依赖关系。通过使用Spring,开发者可以构建松耦合、易于测试和维护的应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker实战】进入四大数据库的命令行模式

上一篇我们讲了docker exec命令,这一次我们使用docker exec命令来进入四大数据库的命令行模式。 我们进行游戏开发或软件开发是离不开四大数据库的,这四大数据库分别是关系型数据库mysql、postgres,nosql数据库redis、mongodb。将它们容器化…

云上聚智——移动云云服务器进行后端的搭建及部署

什么是移动云 移动云是指将移动设备和云计算技术相结合,为移动应用提供强大的计算和存储能力的服务模式。传统的移动应用通常在本地设备上进行计算和存储,而移动云将这些任务转移到云端进行处理。通过移动云,移动设备可以利用云端的高性能计算…

【C++】——入门基础知识超详解

​​​​​​​ 目录 ​编辑 1.C关键字 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 命名空间的使用有三种方式: 注意事项 3. C输入&输出 示例 1:基本输入输出 示例 2:读取多个值 示例 3:处理字符串输入 示例…

神经网络不确定性综述(Part II)——Uncertainty estimation_Single deterministic methods

相关链接: 神经网络不确定性综述(Part I)——A survey of uncertainty in deep neural networks-CSDN博客 神经网络不确定性综述(Part II)——Uncertainty estimation_Single deterministic methods-CSDN博客 神经网络不确定性综述(Part III)——Uncertainty est…

Docker-Android安卓模拟器本地部署并实现远程开发测试

文章目录 1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Ubuntu系统使用Docker部署docker-android安卓模拟器,并结合cpolar内网穿透工具实现公网远程访问本地…

用常识滚雪球:拼多多的内生价值,九年的变与不变

2024年5月22日,拼多多公布了今年一季度财报,该季度拼多多集团营收868.1亿元,同比增长131%,利润306.0亿,同比增长了202%,数据亮眼。 市场对拼多多经历了“看不见”、“看不懂”、“跟不上”三个阶段。拼多多…

STM32无源蜂鸣器播放音乐

开发板:野火霸天虎V2 单片机:STM32F407ZGT6 开发软件:MDKSTM32CubeMX 文章目录 前言一、找一篇音乐的简谱二、确定音调三、确定节拍四、使用STM32CubeMX生成初始化代码五、代码分析 前言 本实验使用的是低电平触发的无源蜂鸣器 无源蜂鸣器是…

【数据库】通过一个实例来认识数据流图DFD

导读:通过一个实例(数据中台)说明数据流图DFD的作用、介绍了常见的数据流图元素及其标准符号以及如何画数据流图。数据流图主要被分析师、系统设计师、流程优化专家、系统管理员以及与系统开发和维护相关的人员查看和使用。对于刚考完2024年5…

设计模式 18 迭代器模式 Iterator Pattern

设计模式 18 迭代器模式 Iterator Pattern 1.定义 迭代器模式 (Iterator Pattern) 是一种行为型设计模式,它提供了一种访问集合元素的标准方法,而无需暴露集合的内部表示。 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该…

B树与B+树区别

B树和B树是常见的数据库索引结构,都具有相较于二叉树层级较少,查找效率高的特点,它们之间有以下几个主要区别: 1.节点存储数据的方式不同 B树的叶子结点和非叶子节点都会存储数据,指针和数据共同保存在同一节点中B树…

vue 引入 emoji 表情包

vue 引入 emoji 表情包 一、安装二、组件内使用 一、安装 npm install --save emoji-mart-vue二、组件内使用 import { Picker } from "emoji-mart-vue"; //引入组件<picker :include"[people,Smileys]" :showSearch"false" :showPreview&q…

YAML详情

一、kubernetes支持对象 Kubernetes支持YAML和JSON格式管理资源对象 JSON格式&#xff1a;主要用于api接口之间消息的传递YAML格式&#xff1a;用于配置和管理&#xff0c;YAML是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 二、YAML语法格式注意点 …

微信小程序开发 tabbar组件常见问题

一、 tabbar不显示问题 问题 刚开始我在app.json中配置了下面的代码&#xff0c;但tabbar并没有显示。代码如下&#xff1a; "tabBar": {"custom": true,"color": "#7A7E83","selectedColor": "#3cc51f","…

C++ | Leetcode C++题解之第113题路径总和II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> ret;unordered_map<TreeNode*, TreeNode*> parent;void getPath(TreeNode* node) {vector<int> tmp;while (node ! nullptr) {tmp.emplace_back(node->val);node …

单点登录与JWT

JWT:JSON Web Token JWT的作用是用户授权&#xff08;Authorization&#xff09;,而不是用户的身份认证&#xff08;Authentication&#xff09; 授权&#xff08;Authorization&#xff09;vs认证&#xff08;Authentication&#xff09; 用户认证指的是使用用户名、密码来…

pytest:指定测试用例执行顺序

在自动化测试中&#xff0c;测试用例的执行顺序有时对测试结果具有重要影响。本文将介绍如何在pytest框架中使用pytest-ordering插件以及Collection hooks来控制测试用例的执行顺序。 方式1&#xff1a; 使用pytest-ordering插件控制执行顺序 1.1 安装pytest-ordering插件 首…

XShell-连接-Centos 7

XShell 连接Centos 7 一.准备 安装XShell XShell下载地址&#xff1a; 在虚拟机上安装Centos 7&#xff0c;具体操作自行学习 二.Centos 7的准备 1.网络适配器修改为NAT 2.获取IP 输入命令&#xff1a; ip addr我的Centos 7对外IP为192.168.174.129 三.XShell连接Cento…

设计模式:适配器模式(Adapter)

设计模式&#xff1a;适配器模式&#xff08;Adapter&#xff09; 设计模式&#xff1a;适配器模式&#xff08;Adapter&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例适配器模式和代理模…

新书推荐:7.1 do while语句

本节必须掌握的知识点&#xff1a; 示例二十二 代码分析 汇编解析 ■do while语句其语法形式&#xff1a; do{ 语句块; }while(表达式) ■语法解析&#xff1a; ●执行do循环体内的语句块&#xff1b; ●判断while语句里的表达式&#xff0c;表达式为真继续下次循环&#…

上位机图像处理和嵌入式模块部署(f103 mcu运行freertos)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 mcu一般有两个用途,一个是控制,一个是非控制。控制类的应用一般要求实时性比较高,什么时候做什么,都是有严格的时间要求的。而非控制类的应用,则要求实现尽可能多的功能,比如…