三层架构与解耦——IoCDI机制【后端 7】

news2024/12/29 9:48:12

三层架构与解耦——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的声明和配置,还提高了代码的可读性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读零信任网络:在不可信网络中构建安全系统17无控制器架构

1. 建立系统框图 1.1. 实现零信任网络的第一步重要工作是建立系统框图 1.2. 系统框图能够帮助我们透彻地理解内部网络和外部网络间的通信模式,有助于系统通信信道的设计 1.3. 对于现有的网络来说,建议首先利用日志工具来记录网络流量,然后…

2万多条初中历史题库ACCESS\EXCEL数据库

这段时间破解了中高学生知识题库,包含高&中英语题库、小&学英语题库、初&中地理题库、初&中历史题库、高&中历史题库、初&中生物题库,数据表结构都一样,今天发的这份是上万条的初中历史题库,截图包含所有…

CSS——伪元素:before

CSS——伪元素&:before 简单介绍: ::after和::before的使用很简单,可以认为其所在元素上存在一前一后的两个的元素,这两个元素默认是内联元素,但我们可以为其增添样式。::after和::before使用的时候一定要注意,必…

数据结构之二叉树详解——包含递归及迭代遍历方式

二叉树的种类 二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节…

计算机毕业设计 扶贫助农系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Golang面试题六(GMP)

目录 1.Go线程实现模型 1:1 关系 N:1关系 M:N关系 2.GM模型 3.GMP模型 概念 模型简介 有关P和M的个数问题 P和M何时会被创建 4.调度器的设计策略 5.go func() 调度流程 6.调度器的生命周期 7.Go work stealing 机制 8.Go hand off 机制 9.Go 抢占式调度 9.Sys…

8.3.数据库基础技术-关系代数

并:结果是两张表中所有记录数合并,相同记录只显示一次。交:结果是两张表中相同的记录。差:S1-S2,结果是S1表中有而S2表中没有的那些记录。 笛卡尔积:S1XS2,产生的结果包括S1和S2的所有属性列,并且S1中每条记…

[C++][opencv]基于opencv实现photoshop算法色阶调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 Levels.hpp #ifndef OPENCV2_PS_LEVELS_HPP_ #define OPENCV2_PS_LEVELS_HPP_#include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp&quo…

Re:从零开始的逆向笔记02day

1-C语言 参数传递 参数传递是通过堆栈的,传递的顺序是从右到左 函数返回值是存储在寄存器eax中 类型 char x -1; //0xFF 1111 1111 int y x; //0xFFFFFFFF 1111 1111 1111 1111 1111 1111 1111 1111 其余位为符号位unsigned char x -1; //0xFF 1111 1111 in…

云快充协议1.5版本的充电桩系统软件

介绍 小程序端:城市切换、附近电站、电桩详情页、扫码充电、充电中动态展示、订单支付、个人中心、会员充值、充值赠送、联系客服; 管理后台:充电数据看板、会员管理、订单管理、充值管理、场站运营、文章管理、财务管理、意见反馈、管理员管…

腾讯云COS和阿里云OSS在Springboot中的使用

引言:之前本来是用OSS做存储的,但是上线小程序发现OSS貌似消费比COS多一些,所以之前做了技术搬迁,最近想起,打算做个笔记记录一下,这里省去在阿里云注册OSS或腾讯云中注册COS应用了。 一、OSS 1、配置yml …

Linux 网络设备驱动

一.网络设备驱动框架 接收 将报文从设备驱动接受并送入协议栈 老API netif_if 编写网络设备驱动 步骤 1.注册一个网络设备 2.填充net_device_ops结构体 3.编写接收发送函数 // SPDX-License-Identifier: GPL-2.0-only /** This module emits "Hello, world"…

IOS 02 SnapKit 纯代码开发

SnapKit是一个Swift语言写的自动布局框架,可以运行到iOS,Mac系统上;OC版本的框架是Masonry,都是出自同一个团队。 用这个框架的目的是,用起来比系统自带的API方便,他内部也是对系统API进行了封装。 为什么…

房产中介小程序

本文来自:ThinkPHPFastAdmin房产中介小程序 - 源码1688 应用介绍 产中介小程序是一款基于ThinkPHPFastAdmin开发的原生微信小程序,为房地产中介提供房源管理、发布、报备客户、跟踪客户以及营销推广获客等服务的系统。 前端演示: 后台演示&am…

HarmonyOS应用开发者基础认证(三)

1、针对包含文本元素的组件,例如Text、Button、TextInput等,可以使用下列哪些属性:(全选) 答案: fontColor fontFamily fontSize fontWeight fontStyle 分析: 2、关于Tabs组件和TabContent组件&…

【高效笔记与整理的艺术】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

通过jmeter对websocket后台做压测

后台使用java程序,通过springboot集成的stomp协议暴露websocket接口,所以下文测试过程会有特定的stomp报文,无需在意,关注流程即可 本次测试使用jmeter模拟大量用户接收群消息的场景,可覆盖连接数以及消息并发的压测 一…

CentOS7.6 RabbitMQ消息队列集群部署——实施方案

1、前期环境准备(每个主机都配置) 1.准备三台主机 IP地址主机名内存大小192.168.200.10 rabbitmq1 2G192.168.200.11rabbitmq22G192.168.200.55rabbitmq32G 2. 设置主机名 hostnamectl set-hostname 主机名suexit Ctrlr 3. 设置IP地址然后重启网卡 …

深度学习与图像修复:ADetailer插件在Stable Diffusion中的应用

文章目录 引言ADetailer插件介绍插件安装常用模型控制提示词参数配置参数详解 实践建议 示例插件的对比:1. ADetailer插件2. Photoshop插件(如Nik Collection)3. GIMP插件(如GMIC)4. Affinity Photo插件 结语 引言 无…

【物联网】(蓝牙篇)微信小程序ios如何自动打开蓝牙

微信小程序打开蓝牙的便捷之道——微信小程序ios如何自动打开蓝牙 随着智能手机蓝牙技术和物联网产品的普及,很多人在使用微信小程序时,都希望能够更便捷地打开蓝牙功能。 在iOS系统上,由于其封闭性和权限控制严格,使得自动打开蓝…