首页 > 其他分享 >Spring使用实现类注入为什么会导致高耦合度(举例)

Spring使用实现类注入为什么会导致高耦合度(举例)

时间:2024-08-15 16:06:22浏览次数:14  
标签:BusinessService ConsoleLogger 实现 Spring 耦合度 接口 举例 Logger public

场景描述

假设我们要开发一个日志记录器组件,记录日志的方式可能有多种实现:控制台输出、文件输出、甚至是发送到远程服务器。为了实现这个功能,我们可以定义一个 Logger 接口来抽象日志记录功能,然后根据不同的需求创建不同的实现类。

1. 接口注入的实现方式

首先,我们定义一个 Logger 接口和两个实现类:ConsoleLoggerFileLogger

public interface Logger {
    void log(String message);
}

@Service
public class ConsoleLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("Console: " + message);
    }
}

@Service
public class FileLogger implements Logger {
    @Override
    public void log(String message) {
        // 这里是将日志写入文件的代码,简单起见,先输出到控制台
        System.out.println("File: " + message);
    }
}

现在,我们有了两个日志记录的实现类:ConsoleLoggerFileLogger。接下来,我们创建一个依赖 Logger 的业务类。

@Component
public class BusinessService {
    private final Logger logger;

    @Autowired
    public BusinessService(Logger logger) {
        this.logger = logger;
    }

    public void doBusiness() {
        logger.log("Business logic executed");
    }
}

在这个例子中,BusinessService 类依赖于 Logger 接口。通过接口注入,Spring可以在运行时选择注入哪一个具体的实现类,比如 ConsoleLoggerFileLogger

  • 松耦合: BusinessService 类只依赖于 Logger 接口,而不依赖具体的 ConsoleLoggerFileLogger 实现类。我们可以在未来轻松替换日志记录的实现,而无需修改 BusinessService 类。

例如,如果业务需求发生变化,我们只需要将配置中的 ConsoleLogger 替换为 FileLogger,而 BusinessService 类不需要做任何修改。这体现了接口注入的灵活性和低耦合度。

2. 实现类注入的实现方式

现在,假设我们不使用接口,而是直接在 BusinessService 类中注入 ConsoleLogger 实现类:

@Component
public class BusinessService {
    private final ConsoleLogger consoleLogger;

    @Autowired
    public BusinessService(ConsoleLogger consoleLogger) {
        this.consoleLogger = consoleLogger;
    }

    public void doBusiness() {
        consoleLogger.log("Business logic executed");
    }
}

在这个版本中,BusinessService 类依赖于具体的 ConsoleLogger 实现类,而不是 Logger 接口。

  • 高耦合: BusinessService 现在与 ConsoleLogger 强耦合。如果将来业务需求要求我们使用 FileLogger,那么我们不得不修改 BusinessService 类,将 ConsoleLogger 替换为 FileLogger。这就增加了代码的耦合度和维护成本。

换句话说,实现类注入使得依赖关系更加刚性。如果我们在多个地方都直接依赖 ConsoleLogger 实现类,那么每次更换实现类时,我们都需要修改这些地方的代码。这不仅会导致工作量的增加,还容易出现错误和遗漏,维护成本较高。

3. 耦合度的比较

  • 接口注入的松耦合: BusinessService 只依赖于抽象的 Logger 接口,因此可以在不修改代码的情况下,灵活地更换不同的实现类。未来如果有新的需求,例如添加一个远程日志记录器,只需新增一个 RemoteLogger 实现类,并配置Spring注入它,而无需修改现有的业务代码。

  • 实现类注入的高耦合: BusinessService 直接依赖于具体的 ConsoleLogger 实现类,这意味着每次更换实现类时都需要修改 BusinessService 类的代码。代码的耦合度高,不易于扩展和维护。

总结

实现类注入的高耦合度体现在代码对具体实现类的直接依赖上,一旦需要更换实现类,所有依赖这个实现类的地方都需要修改。而接口注入则通过依赖抽象接口,实现了松耦合,提升了代码的灵活性和扩展性。

标签:BusinessService,ConsoleLogger,实现,Spring,耦合度,接口,举例,Logger,public
From: https://www.cnblogs.com/echohye/p/18361163

相关文章

  • SpringBoot修改内置tomcat版本的操作步骤
    一:由于Tomcat高危漏洞影响,本文介绍了如何查询和修改Springboot内嵌的Tomcat版本,包括通过POM文件或mvnrepository查询版本,以及通过添加properties配置更改版本。此外,还提到了遇到缺少tomcat-juli依赖时的解决办法。最近Tomcat爆出高危漏洞,基本影响所有的Tomcat版本,故需要对sprin......
  • SpringBoot优雅的封装不同研发环境下(环境隔离)RocketMq自动ack和手动ack
    1.RocketMq的maven依赖版本:<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.3.0</version></dependenc......
  • Java面试题学习(Spring & SpringBoot)
    1.Java基础2.Spring&SpringBoot(正在浏览)目录一、Spring1.谈谈你对Spring的理解?/什么是Spring?2.Spring有什么特点?3.Spring框架中都用到了哪些设计模式?二、SpringIOC4.什么是SpringIOC?什么是SpringIOC容器?有什么作用?5.SpringIOC的实现机制是什么?6.什么是S......
  • 自学[vue+SpringCloud]-011-新建SpringCloud工程demo
    文章目录前言一、新建demo1.新建Maven项目2.填写项目信息二、初始化文件1.父工程的pom.xml2.子工程bztc-study01的pom.xml3.子工程的application.properties4.子工程的启动类三、启动总结前言新建SpringCloud工程demo,让工程能够启动起来。一、新建demo1.......
  • 基于Java Springboot音乐播放器系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA/eclipse数据库:MySQL5.7数据库管理工具:Navicat10以上版本环境......
  • 基于Java Springboot北京医疗企业固定资产管理系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA/eclipse数据库:MySQL5.7数据库管理工具:Navicat10以上版本环境......
  • 基于Java Springboot畅游游戏销售平台
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA/eclipse数据库:MySQL5.7数据库管理工具:Navicat10以上版本环境......
  • 基于Java Springboot超市管理系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA/eclipse数据库:MySQL5.7数据库管理工具:Navicat10以上版本环境......
  • 基于Java Springboot超市在线销售系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA/eclipse数据库:MySQL5.7数据库管理工具:Navicat10以上版本环境......
  • 基于Java Springboot成都某幼儿园兴趣班报名管理系统
    一、作品包含源码+数据库+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA/eclipse数据库:MySQL5.7数据库管理工具:Navicat10以上版本环境配置软件:JDK1.8+Ma......