首页 > 其他分享 >三层架构与解耦——IoC&DI机制【后端 7】

三层架构与解耦——IoC&DI机制【后端 7】

时间:2024-08-12 21:24:02浏览次数:14  
标签:容器 架构 Service DI Spring Dao Controller 注解 IoC

三层架构与解耦——IoC&DI机制

请添加图片描述

在软件开发领域,三层架构(Controller、Service、Dao)是一种广泛采用的架构模式,它通过将应用程序分为三个主要层次来组织代码,旨在提高代码的可维护性、复用性和可扩展性。而解耦(Decoupling)则是实现这些目标的关键技术之一。本文将深入探讨三层架构的好处,并结合Spring框架的控制反转(IoC)和依赖注入(DI)机制,来展示如何在实践中实现代码的解耦。

三层架构详解

1. Controller层

Controller层是应用程序的入口点,负责接收用户的请求,并调用Service层来处理业务逻辑。它主要起到路由和协调的作用,不直接处理业务逻辑,也不直接访问数据库。

2. Service层

Service层是业务逻辑的核心部分,它封装了所有与业务相关的操作。Service层依赖于Dao层来访问数据库,但它不直接操作数据库,而是通过调用Dao层提供的方法来间接访问。

3. Dao层(接口)

Dao层(Data Access Object)负责与数据库进行交互,执行CRUD(创建、读取、更新、删除)操作。Dao层通常以接口的形式存在,以便实现多态,提高代码的灵活性和可维护性。

三层架构的好处
  • 复用性强:各个层之间职责明确,便于在不同的项目中复用Service层和Dao层的代码。
  • 便于维护:当需要修改业务逻辑或数据库访问方式时,只需修改相应的层,而不影响其他层。
  • 利于扩展:随着业务的发展,可以轻松地添加新的层或修改现有层来满足新的需求。
解耦:实现高内聚低耦合

解耦是软件设计中非常重要的一个概念,它旨在减少不同组件之间的依赖关系,提高系统的灵活性和可维护性。在三层架构中,解耦主要通过控制反转(IoC)和依赖注入(DI)来实现。

控制反转(IoC)

IoC是一种设计思想,它将对象的创建权和管理权从代码中转移到外部容器(如Spring容器)中。这样,对象之间就不再需要显式地相互创建和依赖,而是由容器来负责这些工作。这样做的好处是降低了组件之间的耦合度,使得系统更加灵活和可维护。

依赖注入(DI)

DI是IoC的一种实现方式,它通过容器在运行时为对象提供所需的依赖资源。在Spring框架中,我们可以使用注解(如@Autowired)或XML配置文件来指定依赖关系,然后由Spring容器在运行时将这些依赖注入到对象中。这样做的好处是减少了组件之间的直接依赖,使得代码更加清晰和易于管理。

任务:完成Controller层、Service层、Dao层的代码解耦

为了完成三层架构的代码解耦,我们可以按照以下步骤进行:

  1. 删除Controller层、Service层中new对象的代码:在三层架构中,我们应该避免在Controller层或Service层中直接通过new关键字创建对象。相反,我们应该将这些对象的创建和管理交给Spring容器。
  2. Service层及Dao层的实现类,交给IOC容器管理:在Spring配置文件中或通过注解,将Service层和Dao层的实现类声明为bean,这样它们就会被Spring容器所管理。
  3. 为Controller及Service注入运行时依赖的对象:使用@Autowired等注解或XML配置文件,在Controller和Service类中注入它们所依赖的对象。这样,当Spring容器启动时,它会自动为这些类注入所需的依赖对象。

通过以上步骤,我们可以有效地实现三层架构的代码解耦,提高系统的灵活性和可维护性。同时,这也为未来的扩展和修改提供了便利。

@Component及其衍生注解

在Spring中,@Component注解是一个泛化的概念,用于标记一个类作为组件类,以便Spring容器能够自动检测并注册为Spring应用上下文中的bean。然而,为了更清晰地表达组件在应用程序中的角色和层次,Spring提供了@Component的三个特定化注解:@Controller@Service@Repository

@Controller
  • 用途@Controller注解用于标注在控制层(Controller Layer)的类上,表明该类是一个Spring MVC控制器。控制器负责处理由DispatcherServlet分发的请求,并将请求结果返回给客户端。
  • 特点:Spring MVC框架会扫描带有@Controller注解的类,并自动将其注册为请求处理器(Handler)。这些控制器中的方法可以使用@RequestMapping或其派生注解来映射具体的请求路径。
@Service
  • 用途@Service注解用于标注在业务逻辑层(Service Layer)的类上,表明该类提供了业务逻辑服务。业务逻辑层负责处理应用程序的核心业务逻辑,它可能依赖于数据访问层(DAO)来获取或存储数据。
  • 特点@Service注解的类会被Spring容器自动检测并注册为bean,从而使得这些服务可以在整个应用程序中被其他组件所引用和使用。
@Repository
  • 用途@Repository注解用于标注在数据访问层(DAO Layer)的类上,表明该类是用于访问数据库的。尽管Spring的数据访问技术不局限于JDBC,但@Repository注解主要用于标识那些实现了数据访问的类。
  • 特点@Repository注解的类不仅会被Spring容器自动检测并注册为bean,而且Spring还会为这些bean提供额外的功能,比如异常转换(将运行时异常转换为Spring的DataAccessException),从而使得数据访问异常的处理更加一致和方便。

总结

通过使用@Controller@Service@Repository这些@Component的衍生注解,Spring开发者可以更加清晰地定义应用程序的层次结构,同时享受Spring IoC容器提供的便利,如自动装配、依赖注入等。这些注解不仅简化了bean的声明和配置,还提高了代码的可读性和可维护性。

标签:容器,架构,Service,DI,Spring,Dao,Controller,注解,IoC
From: https://blog.csdn.net/delepaste/article/details/141141688

相关文章

  • Fotify扫描结果Open Redirection解决方案
    URL任意跳转漏洞,又叫开放重定向漏洞,是一种常见的安全漏洞。当访问时用widow.href或者window.localtion指定跳转地址时,会报此漏洞。网上的解决方案大致分为两种。方法一:种是对跳转URL进行加密,使用方法functionvalidateURL(surl){varurl......
  • Codeforces Round 964 (Div. 4)
    CodeforcesRound964(Div.4)标题CodeForces1999A.A+BAgain?时限1second空限256megabytes题目描述给定一个两位数的正整数\(n\),求其数字之和。输入第一行包含一个整数\(t\)(\(1\leqt\leq90\))——测试用例的数量。每个测试用例的唯一一行包含一个两位数的正......
  • 成功安装torch但使用却Error loading “..\Lib\site-packages\torch\lib\fbgemm.
    OSError:[WinError126]找不到指定的模块。Errorloading"..\lib\fbgemm.dll"1.问题不大,实际上是fbgemm.dll缺少了一个依赖文件。可以用Dependencies来查看。下载地址:https://github.com/lucasg/Dependencies/releases选择你电脑喜欢的配置下载一个release.zip下......
  • 在K8S中,简单陈述⼀下K8S架构?
    K8S(Kubernetes)是一个开源的容器编排和管理平台,它提供了容器部署、扩展、管理以及服务发现等功能。K8S的架构可以大致分为控制平面(ControlPlane)和工作节点(WorkerNodes)两部分。以下是对K8S架构的详细陈述:一、控制平面(ControlPlane)控制平面是K8S集群的“大脑”,负责集群的调度、......
  • AGC182 C - Sum of Number of Divisors of Product
    题目大意:求长度为1,2,...N,的好序列因数个数。好序列满足每个元素\(1\leqx\leqM\)\(N\leq1e18,M\leq16\)很容易想到维护所有好序列质因数的指数+1的乘积。\(\prodb_i,1\leqi\leq6\).考虑每个数对这个乘积的影响。假设我们只有2,3,5这三个质数,序列末端添加15,......
  • 系统报错影响美观?gdiplus.dll修复教程,拯救小鸟壁纸加载
    系统报错,特别是gdiplus.dll文件丢失,确实会影响小鸟壁纸等软件的正常加载,进而影响桌面美观。为了解决这个问题,以下是一个详细的gdiplus.dll修复教程,旨在帮助您拯救小鸟壁纸的加载问题:一、了解gdiplus.dll文件gdiplus.dll是Windows系统中用于图形用户界面(GUI)渲染的重要组件,......
  • NoSQL之Redis配置与优化
    Redis简介Redis(RemoteDictionaryServer,远程字典型)是一个开源的、使用C语言编写的NoSQL数据库。Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环Redis优点:具有极高的数据读写速度,数据读取的速度最高可达到110000次/......
  • NoSQL 之Redis集群
    Redis集群的实现方法一般有客户端分片、代理分片和服务器端分片三种解决方案目录一:Redis集群方式主从复制哨兵模式集群模式(Redis-Cluster)二、数据分片方式客户端分片代理分片服务器分片三、故障处理故障转移多slave选举四、Redis群集部署1:安装redis(每个节点......
  • C# Binding之 DataContext 测试
    <Windowx:Class="WpfApp2.BindingTest5"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • 在clion IDE中编写ADI CCES的工程代码,cmake设置
    有时需要在CCES中编译代码,或者在stm32的mdk或者stm32cubeide中编译,但是习惯了在clion中编写代码,但是clion中需要CMAKES设置,所以需要自己写一个cmake文件,下面是一个模板文件cmake_minimum_required(VERSION3.24)project(proj_name)#add_definitions(-DCORE0-D_DEBUG-DAD......