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 {
    @Override
    public 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 {
    @Bean
    public Logger logger() {
        return new ConsoleLogger();
    }

    @Bean
    public 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,开发者可以构建松耦合、易于测试和维护的应用程序。

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

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

相关文章

微服务:利用RestTemplate实现远程调用

打算系统学习一下微服务知识,从今天开始记录。 远程调用 调用order接口,查询。 由于实现还未封装用户信息,所以为null。 下面我们来使用远程调用用户服务的接口,然后封装一下用户信息返回即可。 流程图 配置类中注入RestTe…

解决IE11通过主机名访问和IP地址访问,CSS渲染效果不一致问题

软件环境 spingboot:版本2.6.13 浏览器:IE11 问题描述 html用css渲染,浏览器输入IP地址访问,和输入主机名访问,效果不一样,如下图: IP地址访问才是我想要的效果,主机访问菜单半透明向下箭头…

商城项目【尚品汇】02初始项目搭建及其代码提交

1.项目结构 1、首先在本地创建ssh key; DELLLJL MINGW64 ~/Desktop $ ssh-keygen -t rsa -C "自己的qq.com"后面的your_emailyouremail.com改为你在gitee上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行…

【区块链】外部应用程序与区块链进行交互

一,外部应用程序与区块链进行交互案例目标与流程 1.1案例目标 掌握FISCO BCOS应用环境的搭建 与使用(FISCO BCOSWeBASE)掌握基于Java SpringBoot的应 用程序后端项目搭建与开发。掌握应用程序后端与FISCO BCOS 链的交互。掌握应用程序前端…

Golang | Leetcode Golang题解之第108题将有序数组转换为二叉搜索树

题目: 题解: func sortedArrayToBST(nums []int) *TreeNode {rand.Seed(time.Now().UnixNano())return helper(nums, 0, len(nums) - 1) }func helper(nums []int, left, right int) *TreeNode {if left > right {return nil}// 选择任意一个中间位置…

如何通过软件IIC使用MPU6050陀螺仪

目录 1. MPU6050简介 2. MPU6050参数 3. MPU6050硬件电路 4. 代码编写 4.1 MPU6050写寄存器 4.2 MPU6050读寄存器 4.3 初始化 4.4 MPU6050获取ID号 4.5 MPU6050获取数据 1. MPU6050简介 MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的…

代码随想录--哈希表--有效的字母异位词

题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 思路 先看暴力的解法&am…

AI智能体|使用扣子Coze基于IDE创建自定义插件

大家好,我是无界生长。 在使用Coze的过程中,有些个性化场景无法通过插件商店已有的插件满足,这个时候就需要通过自定义插件的方式来实现业务需求。下面将通过一个实际案例来简单介绍下如何使用Coze基于IDE创建自定义插件,完成在Co…

JAVA基础Day 1面向对象

目录 包调用包 对象和类多态继承重写与重载 抽象接口接口的声明接口的实现 包 package bao;class FreshJuice{enum FreshJuiceSize{small,medium,lager}FreshJuiceSize size; } public class aa {public static void main(String[] args) {System.out.println("hello&quo…

word如何按照原本页面审阅文档

1 视图-阅读视图 2 视图,自己看,懒得打字了哈哈

基于物联网表计的综合能源管理方案

安科瑞电气股份有限公司 祁洁 acrelqj 摘要:为加快推进国家“双碳”战略和新型能源体系建设,努力实现负荷精准控制和用户精细化管理,按照“政府主导、电网组织、政企协同、用户实施”的指导原则,多地成立市/县级电力负荷管理中…

AI网络爬虫:批量爬取电视猫上面的《庆余年》分集剧情

电视猫上面有《庆余年》分集剧情&#xff0c;如何批量爬取下来呢&#xff1f; 先找到每集的链接地址&#xff0c;都在这个class"epipage clear"的div标签里面的li标签下面的a标签里面&#xff1a; <a href"/drama/Yy0wHDA/episode">1</a> 这个…

Android 观察者模式(OBSERVER)应用详解

文章目录 1、观察者模式设计初衷1.1. 解耦对象之间的依赖关系1.2. 允许动态的依赖关系1.3. 自动通知和更新1.4 设计初衷的详细说明1. 对象之间的解耦2. 动态依赖关系3. 自动更新 2、实现细节2.1. Subject 接口和实现2.2. Observer 接口和实现2.3. 主类 3、主要角色4、关系示意图…

Vue02-黑马程序员学习笔记

一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 &#xff08;演示&#xff09; 渲染 / 删除 / 修改数量 …

创建桌面快捷方式

①点击桌面任务栏中的【开始图标】>点击【所有应用】 ②将【EndNote】图标拖到电脑桌面。

Defog发布Llama-3-SQLCoder-8B,文本转SQL模型,性能比肩GPT-4,准确率超90%,消费级硬件可运行

前言 在计算语言学领域&#xff0c;将自然语言转化为可执行的SQL查询是一个重要的研究方向。这对于让那些没有编程或SQL语法知识的用户也能轻松访问数据库信息至关重要。Defog团队近日发布了基于Llama-3的SQLCoder-8B模型&#xff0c;它在文本转SQL模型领域取得了显著突破&…

【LLM多模态】LLava模型结构和训练过程 | CLIP模型

note CLIP使用了对比学习的方法&#xff0c;即通过正样本&#xff08;匹配的图像-文本对&#xff09;和负样本&#xff08;不匹配的图像-文本对&#xff09;来训练模型。在训练过程中&#xff0c;模型会尝试最大化正样本对的相似度&#xff08;比如通过计算余弦相似度&#xf…

单细胞分析(Signac): PBMC scATAC-seq 聚类

引言 在本教学指南中&#xff0c;我们将探讨由10x Genomics公司提供的人类外周血单核细胞&#xff08;PBMCs&#xff09;的单细胞ATAC-seq数据集。 加载包 首先加载 Signac、Seurat 和我们将用于分析人类数据的其他一些包。 if (!requireNamespace("EnsDb.Hsapiens.v75&qu…

HTTP3

HTTP 状态码&#xff1a;描述了这次HTTP请求是否成功&#xff0c;以及失败的原因。 他们用相应的状态码来描述异常的发现。 常见的状态码 1.200 OK 访问成功。 2.404 NOT Found 客户端请求的资源在服务器这边不存在 URL&#xff1a;ip端口路径查询字符串 3.403 Forbid…

SQL刷题笔记day1

1题目 我的代码&#xff1a; select * from employees order by hire_date desc limit 2,1 标准代码&#xff1a; select * from employees where hire_date (select distinct hire_date from employees order by hire_date desc limit 2,1) 复盘&#xff1a;因为按照入…