当前位置: 首页 > news >正文

分层解耦

三层架构

controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据,

service:业务逻辑层,处理具体的业务逻辑。

dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。

三层架构的作用就是将步骤细化,每一个类只执行一个操作,避免代码的耦合性 

在前端发送请求后,服务端往往要根据前端的请求做一些处理,如:根据前端请求往往要进行,访问数据库的信息(dao层),将得到的信息进行处理(service层)

 分层解耦

内聚:软件中各个功能模块内部的功能联系。

耦合:衡量软件中各个层/模块之间的依赖、关联的程度。

软件设计原则:高内聚低耦合

控制反转:1Inversion Of Control,简称I0C。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

依赖注入:Dependency Iniection,简称D。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

Bean对象:IOC容器中创建、管理的对象,称之为bean。


IOC&DI入门

①.Service层及 Dao层的实现类,交给IOC容器管理。

②.为Controller及Service注入运行时,依赖的对象。

③.运行测试。

IOC

Bean的声明

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

注意事项

声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。

使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller.

Bean组件扫描

前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。

@Componentscan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解

@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。

若是如下图就会报错,因为dao不在启动类所在包及其子包

 报错如下:

 解决方案:

手动设置@Componentscan注解

 按照规范,前面声明bean的四大注解一般都在启动类同一个包内,这样不用手动设置@Componentscan注解了

Bean注入

@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:

通过以下几种方案来解决:

@Primary

 @Qualifier

 @Resource

@Resource 与 @Autowired区别

@Autowired 是spring框架提供的注解,而@Resource是IDK提供的注解

@Autowired 默认是按照类型注入,而@Resource默认是按照名称注入。

相关文章:

分层解耦

三层架构 controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据, service:业务逻辑层,处理具体的业务逻辑。 dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数…...

GenICam标准(六)

系列文章目录 GenICam标准(一) GenICam标准(二) GenICam标准(三) GenICam标准(四) GenICam标准(五) GenICam标准(六) 文章目录 系列文…...

JavaFX VBox

VBox布局将子节点堆叠在垂直列中。新添加的子节点被放置在上一个子节点的下面。默认情况下,VBox尊重子节点的首选宽度和高度。 当父节点不可调整大小时,例如Group节点,最大垂直列的宽度基于具有最大优选宽度的节点。 默认情况下,…...

xss+csrf项目实例

项目背景: 如下:我们是在一个类似文章管理系统的网站上面发现的该漏洞。我们将其运行在本地的phpstudy集成环境上面。 源码地址下载链接:https://pan.baidu.com/s/1MpnSAq7a_oOcGh4XgPE-2w 提取码:4444 考察内容: …...

速盾:cdn加速怎么计费?

CDN加速(Content Delivery Network)是一种将内容部署在全球多个节点上,通过就近访问提供服务的技术。它可以加快网站的速度和可靠性,同时减轻源服务器的负载。在使用CDN加速服务时,计费是一个重要的问题,下…...

Vue3 中 props 与 emit 用法

在 Vue3 中,props 和 emit 的用法有所改变,主要的变化在于它们现在都通过 setup 函数来访问和使用。 props: props 用于父组件向子组件传递数据。在 setup 函数中,props 是一个参数,我们可以通过它访问到父组件传入的所有 prop 值…...

【python】如何import 另一个路径下的py文件内容

目录结构: ├─common │ └─config.py └─own_module │ └─run.py问题描述: 如何在run.py 中调用 config.py 中的函数或类? 解决办法: import os import sys # 为了引用自定义模块,可临时将module的绝对路径…...

C/C++ Adaline自适应线性神经网络算法详解及源码

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…...

UniApp+Vue3使用Vant-微信小程序组件

第一步:打开创建好的UniappVue3的项目 第二步:下载Vant-Weapp npm i vant/weapp -S --production 第三步:修改目录名称 wxcomponents 必须是wxcomponents 第四步:将下载好的vant中的dist目录剪切到当前wxcomponents目录下 第五…...

python IP 端口 socket tcp 介绍

IP 端口 介绍 1、IP IP地址是分配给网络设备上网使用的数字标签,它能够标识网络中唯一的一台设备 windows环境可以使用 ipconfig 来查看自己的iplinux环境可以使用 ifconfig 来查看自己的ip 2、端口 端口是传输数据的通道,每个操作系统上都有 65535个…...

【动态规划】| 路径问题之最小路径和 力扣64

🎗️ 主页:小夜时雨 🎗️专栏:动态规划 🎗️如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/minimum-path-sum/description/ 这道题目和之前一道…...

如何在vector中插入和删除元素?

在C的std::vector中插入和删除元素通常使用其成员函数来完成。以下是如何在std::vector中插入和删除元素的示例&#xff1a; 插入元素 在末尾插入元素&#xff1a;使用push_back函数。 cpp复制代码 #include <vector> int main() { std::vector<int> v; v.push_…...

独具韵味的移动端 UI 风格

独具韵味的移动端 UI 风格...

【SpringBoot】SpringBoot:构建实时聊天应用

文章目录 引言项目初始化添加依赖 配置WebSocket创建WebSocket配置类创建WebSocket处理器 创建前端页面创建聊天页面 测试与部署示例&#xff1a;编写单元测试 部署扩展功能用户身份验证消息持久化群组聊天 结论 引言 随着实时通信技术的快速发展&#xff0c;聊天应用在现代We…...

基于Matlab的车牌识别停车场出入库计时计费管理系统(含GUI界面)【W6】

简介&#xff1a; 在当今城市化进程加快的环境下&#xff0c;停车管理成为了一个日益重要和复杂的问题。城市中的停车资源有限&#xff0c;如何高效利用和管理这些资源&#xff0c;不仅关乎市民出行便利性&#xff0c;也涉及到城市交通拥堵、环境污染等诸多问题的解决。 传统的…...

大众点评js逆向过程(未完)

相关链接 1、控制流平坦化进行AST 解析 AST网址 2、JS进制转换&#xff08;Function.prototype.call&#xff09; 1、断点调试mtgsig参数 这里mtgsig已经被拼到url中 2、进入后mtgsig已经计算完&#xff0c; ir he(this[b(4326)], !1), 就是加密函数 ![在这里插入图片描述…...

web前端如何设置单元格:深入解析与实用技巧

web前端如何设置单元格&#xff1a;深入解析与实用技巧 在web前端开发中&#xff0c;设置单元格是一个常见且重要的任务。无论是构建数据表格、表单还是其他界面元素&#xff0c;都需要对单元格进行精确的设置和样式调整。那么&#xff0c;web前端究竟如何设置单元格呢&#x…...

龙迅LT9611UXC 2 PORT MIPIDSI/CSI转HDMI 2.1,支持音频IIS/SPDIF输入,支持标准4K60HZ输出

龙迅LT9611UXC描述&#xff1a; LT9611UXC是一个高性能的MIPI DSI/CSI到HDMI2.0转换器。MIPI DSI/CSI输入具有可配置的单端口或双端口&#xff0c;1高速时钟通道和1~4高速数据通道&#xff0c;最大2Gbps/通道&#xff0c;可支持高达16Gbps的总带宽。LT9611UXC支持突发模式DSI视…...

红黑树(C++)

文章目录 写在前面1. 红黑树的概念及性质1. 1 红黑树的概念1. 2 红黑树的性质 2. 红黑树节点的定义3. 红黑树的插入3.1 按照二叉搜索的树规则插入新节点3.2 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏 4.红黑树的删除5.红黑树的验证6.源码 写在前面 在上篇文章中&…...

PyCharm设置不默认打开上次的项目

第一步 第二步 第三步 测试...

QUARTUS 2 基本操作使用(quartus13.0)

本文从建立完工程开始&#xff0c;到下载结束 编写设计文件 点击Files&#xff0c;可以添加设计文件 设置工程顶层 ​编辑 再此介绍下工具栏&#xff0c;只介绍用的多的 绑定引脚&#xff1a;fpga大部分引脚都是GPIO&#xff0c;因此给他编辑代码后&#xff08;赋予他功能&am…...

终极Luau面向对象编程指南:掌握类、继承和多态的实现技巧

终极Luau面向对象编程指南&#xff1a;掌握类、继承和多态的实现技巧 【免费下载链接】luau A fast, small, safe, gradually typed embeddable scripting language derived from Lua 项目地址: https://gitcode.com/gh_mirrors/lu/luau Luau是一种快速、小巧、安全、渐…...

FxSound驱动开发详解:从Version11到Version14的完整演进历程

FxSound驱动开发详解&#xff1a;从Version11到Version14的完整演进历程 【免费下载链接】fxsound-app FxSound application and DSP source code 项目地址: https://gitcode.com/gh_mirrors/fx/fxsound-app FxSound驱动开发是音频增强技术的核心&#xff0c;从Version1…...

OpenClaw 配置 scnet API 完整指南 - 被低估的国产大模型 API

OpenClaw 配置 scn# OpenClaw 配置 scnet API 完整指南 写在前面 如果你正在使用 OpenClaw&#xff0c;相信你已经对 AI Agent 有了深入的了解。但在模型选择上&#xff0c;很多人只知道 OpenAI、OpenRouter&#xff0c;却忽视了一个非常优秀的国产选择 —— scnet。 本文将…...

Android日志记录终极指南:如何用Timber提升开发效率

Android日志记录终极指南&#xff1a;如何用Timber提升开发效率 【免费下载链接】timber JakeWharton/timber: 是一个 Android Log 框架&#xff0c;提供简单易用的 API&#xff0c;适合用于 Android 开发中的日志记录和调试。 项目地址: https://gitcode.com/gh_mirrors/ti/…...

AHT20温湿度传感器在STM32上的应用:从数据采集到OLED显示

AHT20温湿度传感器在STM32上的实战应用&#xff1a;从数据采集到OLED可视化 在物联网和智能硬件开发中&#xff0c;环境数据的实时监测与可视化是基础却关键的一环。AHT20作为新一代数字温湿度传感器&#xff0c;以其高精度、低功耗和I2C接口的便捷性&#xff0c;成为STM32开发…...

【OSG学习笔记】Day 17: Shape 与 ShapeDrawable

osg::Shape 与 osg::ShapeDrawable 在 OpenSceneGraph&#xff08;OSG&#xff09;三维开发中&#xff0c;除了通过 osg::Geometry 手动构建顶点、索引实现自定义几何体外&#xff0c;OSG 还提供了开箱即用的基础图形封装——osg::Shape 与 osg::ShapeDrawable。 这两个类专门用…...

SpringBoot项目如何动态加载用户上传的Jar包?两种热部署方案对比

SpringBoot动态加载用户Jar包实战&#xff1a;两种热部署方案深度解析 在当今快速迭代的软件开发环境中&#xff0c;插件化架构正成为提升系统扩展性的关键策略。作为Java生态中最流行的框架之一&#xff0c;SpringBoot项目常面临需要动态加载用户自定义Jar包的需求场景。本文将…...

Pyenv虚拟环境管理全攻略:从创建到迁移(Ubuntu20.04实战)

Pyenv虚拟环境管理全攻略&#xff1a;从创建到迁移&#xff08;Ubuntu20.04实战&#xff09; 在Python开发中&#xff0c;项目依赖管理一直是个令人头疼的问题。想象一下这样的场景&#xff1a;你正在维护一个基于Django 2.2的老项目&#xff0c;同时又要开发一个使用最新Djang…...

MCP2518FD屏蔽寄存器自动配置算法(11bit标准帧多ID接收场景)

1. 为什么需要自动配置屏蔽寄存器&#xff1f; 在CAN总线通信中&#xff0c;MCP2518FD作为一款常用的CAN控制器&#xff0c;经常需要处理多ID接收的场景。想象一下你正在开发一个汽车电子控制单元(ECU)&#xff0c;需要同时接收来自发动机、变速箱、ABS等多个模块的数据。每个…...