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

javaweb_07:分层解耦

一、三层架构

(一)基础

在请求响应中,将代码都写在controller中,看起来内容很复杂,但是复杂的代码总体可以分为:数据访问、逻辑处理、接受请求和响应数据三个部分。在程序中我们尽量让一个类或者一个方法只有一个功能,这就是单一职责原则。增强可读性和可扩展性,减少代码复杂性。为此将三层架构分为controller(接受请求、相应数据),Service(逻辑处理),Dao(数据访问)。
在这里插入图片描述

  • Controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
  • Service:业务逻辑层,处理具体的业务逻辑。
  • Dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查。

在这里插入图片描述

(二)实例拆分

以javaweb_06:请求响应——响应 中的四、实例为例,将其拆分为三部分,首先为实现service和dao分别创建接口,然后分别实现其接口。
controller原本的代码:

    @RequestMapping("/listEmp")public Result list(){//1、加载并解析emp.xml文件String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();List<Emp> empList = XmlParserUtils.parse(file, Emp.class);//2、对数据进行转化(那么就需要遍历)处理 gender和jobempList.stream().forEach(emp -> {String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");} else if ("2".equals(gender)) {emp.setGender("女");}//处理job 1讲师 2班主任 3就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");} else if ("2".equals(job)) {emp.setJob("班主任");} else if ("3".equals(job)) {emp.setJob("就业指导");}});//3、响应数据return Result.success(empList);}

1、拆分结构

在这里插入图片描述

2、创建接口

EmpDao.java

package org.example.dao;import org.example.pojo.Emp;import java.util.List;public interface EmpDao {//获取员工列表数据public List<Emp> listEmp();
}

EmpService.java

package org.example.service;
import org.example.pojo.Emp;import java.util.List;
public interface EmpService {public List<Emp> listEmp();
}

3、实现接口

创建对应的类实现接口中定义的方法:
EmpDaoA.java

package org.example.dao.impl;import org.example.dao.EmpDao;
import org.example.pojo.Emp;
import org.example.utils.XmlParserUtils;import java.util.List;public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmp() {//1、加载并解析emp.xml文件String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();List<Emp> empList = XmlParserUtils.parse(file, Emp.class);return empList;}
}

EmpServiceA.java

package org.example.service.impl;import org.example.dao.EmpDao;
import org.example.dao.impl.EmpDaoA;
import org.example.pojo.Emp;
import org.example.service.EmpService;
import java.util.List;public class EmpServiceA implements EmpService {public EmpDao empDao = new EmpDaoA();@Overridepublic List<Emp> listEmp() {//1、调用dao获取数据List<Emp> empList = empDao.listEmp();//2、对数据进行转化(那么就需要遍历)处理 gender和jobempList.stream().forEach(emp -> {String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");} else if ("2".equals(gender)) {emp.setGender("女");}//处理job 1讲师 2班主任 3就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");} else if ("2".equals(job)) {emp.setJob("班主任");} else if ("3".equals(job)) {emp.setJob("就业指导");}});return empList;}
}

修改EmpController.java

package org.example.controller;import org.example.pojo.Emp;
import org.example.pojo.Result;
import org.example.service.EmpService;
import org.example.service.impl.EmpServiceA;
import org.example.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class EmpController {private EmpService empService = new EmpServiceA();@RequestMapping("/listEmp")public Result list(){//1、调用service获取数据List<Emp> empList = empService.listEmp();//3、响应数据return Result.success(empList);}
}

在这里插入图片描述

二、分层解耦

内聚:软件中各个功能模块内部的功能联系
耦合:衡量软件中各个层/模块之间的依赖关系、关联的程度。
控制反转:Inversion Of Control 简称IOC,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为bran。

三、IOC&DI入门

1、控制反转

Service层及Dao层的实现类交给IOC容器管理。
在这里插入图片描述
在这里插入图片描述

2、依赖注入

为Controller及Service注入运行时依赖的对象。
在这里插入图片描述
在这里插入图片描述

3、运行测试

在这里插入图片描述

四、IOC详解

1、Bean的声明

从Conponent衍生出三类,分别管理每一层,如果对象由不由这三层管理,但是还想交给IOC容器直接管理,才直接由Conponent注解。
在这里插入图片描述
注:
①声明bean的时候,可以通过Value属性指定bean的名字,如果没有指定,默认类名首字母小写.
②使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller.

2、bean的组件扫描

①之前声明得bean的四大注解,想要生效,还需要被组件扫描注解@ComponenetScan扫描
②@ComponentScan注解虽然没有显式配置,但是实际上已经包含了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在的包及其子包

五、DI详解

1、bean注入:
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报错。
解决方法:
@Primary:设置bean的优先级,想要谁先生效就将该注释加在它之前
@Qualifier:在@Autowired注解之后加上@Qualifier(“想要生效的名字”)
@Resource:不使用@Autowired,而是换成@Resource(name=“指定的名字”)

2、@Resource与@Autowired的区别
①@Autowired是Spring框架提供的注解,而@Resource是JDK提供的注解。
②@Autowired默认按照类型注入,而@Resource默认按照名称注入

相关文章:

javaweb_07:分层解耦

一、三层架构 &#xff08;一&#xff09;基础 在请求响应中&#xff0c;将代码都写在controller中&#xff0c;看起来内容很复杂&#xff0c;但是复杂的代码总体可以分为&#xff1a;数据访问、逻辑处理、接受请求和响应数据三个部分。在程序中我们尽量让一个类或者一个方法…...

调用 Python 开源库,获取油管英文视频的手动或自动英文srt字幕,以及自动中文简体翻译srt字幕

前提条件 非常抱歉&#xff0c;这个程序就是个雏形&#xff0c;非常不完善&#xff0c;输入需要手动编辑&#xff0c;凑活着可以用&#xff0c;请自己完善吧。 开源声明&#xff1a;此文代码引用了一个开源MIT License的Python库&#xff0c;其他代码是本人自写自用。你可以随…...

UDP协议实现通信与数据传输(创建客户端和服务器)

目录 一、UDP &#xff08;传输层&#xff0c;用户数据报协议&#xff09; 二、服务器Server的创建 三、客户端Client的创建 四、效果实现&#xff08;描述&#xff09; 一、UDP &#xff08;传输层&#xff0c;用户数据报协议&#xff09; UDP&#xff08;User Datagram Pr…...

【红黑树】

红黑树 小杨 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩倍&am…...

排序算法——简单选择排序

一、算法原理 简单选择排序是一种基本的排序算法&#xff0c;其原理是每次从未排序的元素中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;然后与未排序部分的第一个元素交换位置&#xff0c;直到所有元素都被排序。 二、算法实现流程 简单选择排序法(Simple Se…...

OpenAI API推出结构化输出功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Python 异步编程:Sqlalchemy 异步实现方式

SQLAlchemy 是 Python 中最流行的数据库工具之一&#xff0c;在新版本中引入了对异步操作的支持。这为使用异步框架&#xff08;如 FastAPI&#xff09;开发应用程序带来了极大的便利。在这篇文章中&#xff0c;简单介绍下 SQLAlchemy 是如何利用 Greenlet 实现异步操作的。 什…...

父类引用指向子类对象

在 Java 中&#xff0c;父类引用可以指向子类对象&#xff0c;这是多态的一种表现。这种特性允许你使用父类的引用来操作子类对象&#xff0c;从而实现更灵活和可扩展的代码设计。 基本概念 多态&#xff1a;父类引用可以指向子类对象。这使得你可以用统一的接口处理不同的对象…...

分享一个基于Spring Boot的面向社区的智能化健康管理系统的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…...

【扒代码】reduction参数是什么

model DensityMapRegressor(in_channels256, reduction8)reduction 参数在 DensityMapRegressor 类中用于决定模型在上采样过程中的层级配置。具体来说&#xff0c;它决定了上采样过程中使用多少个 UpsamplingLayer&#xff0c;从而影响输出的分辨率。 reduction 参数的作用 …...

Python,Spire.Doc模块,处理word、docx文件,极致丝滑

Python处理word文件&#xff0c;一般都是推荐的Python-docx&#xff0c;但是只写出一个&#xff0c;一句话的文件&#xff0c;也没有什么样式&#xff0c;就是36K。 再打开word在另存一下&#xff0c;就可以到7-8k&#xff0c;我想一定是python-docx的问题&#xff0c;但一直没…...

redis的安装与命令

一、redis与memcache总体对比 1.性能 Redis&#xff1a;只使用单核&#xff0c;平均每一个核上Redis在存储小数据时比Memcached性能更高。 Memcached&#xff1a;可以使用多核&#xff0c;而在100k以上的数据中&#xff0c;Memcached性能要高于Redis。 2.内存使用效率 Mem…...

【C++】特殊类设计类型转换

目录 &#x1f4a1;前言一&#xff0c;特殊类设计1. 请设计一个类&#xff0c;不能被拷贝2. 请设计一个类&#xff0c;只能在堆上创建对象3. 请设计一个类&#xff0c;只能在栈上创建对象4. 请设计一个类&#xff0c;不能被继承5. 请设计一个类&#xff0c;只能创建一个对象(单…...

为git 命令行 设置代理环境变量

http://t.csdnimg.cn/cAxkg 国内需要修改pinoko根目录下gitconfig文件&#xff0c;添加 [http]proxy http://127.0.0.1:1080 [https]proxy https://127.0.0.1:1080或者通过命令行配置&#xff1a; git config --global http.proxy http://127.0.0.1:1080 git config --glo…...

自定义linux某些常见配置

1.当前路径 echo "PS1\u\h:\w\$ " >> /etc/profile source /etc/profile 2.ssh使能 1.开启openssh 2.权限赋予chown root.root /var/empty/ 3.开发板作为server echo "PermitRootLogin yes" >> /etc/ssh/sshd_config 3开机自启动脚本 1.init…...

告别手动操作!KeyMouseGo实现自动化工作流

前言 在这个快节奏的时代&#xff0c;我们每天都在与电脑打交道&#xff0c;重复着那些繁琐而单调的操作&#xff1b;你是否曾想过&#xff0c;能让电脑自己完成这些任务&#xff0c;而你则悠闲地喝着咖啡&#xff0c;享受着生活&#xff1f;今天&#xff0c;就让我们一起揭开一…...

大型语言模型微调 新进展-4篇 论文

1. Brevity is the soul of wit: Pruning long files for code generation 发布时间&#xff1a;2024-06-29链接&#xff1a;https://arxiv.org/abs/2407.00434机构&#xff1a;伦敦大学学院 (UCL) 本研究针对大型语言模型的代码生成任务中的数据清理问题进行了探索。研究发现…...

专业课140+杭电杭州电子科技大学843信号与系统考研经验电子信息与通信工程真题,大纲,参考书。

顺利上岸杭电&#xff0c;由于专业课考的不错140&#xff0c;群里不少同学希望分享一点经验&#xff0c;回头看看这一年考研复习&#xff0c;确实有得有失&#xff0c;总结一下自己的专业课复习经验&#xff0c;希望对大家有帮助&#xff0c;基础课考的没有专业好&#xff0c;而…...

php 中 (0 == ‘abc‘) 为真

https://andi.cn/page/621653.html...

MacOS Anaconda 安装教程及虚拟环境创建

一、下载 Anaconda 1、Anaconda 官网 2、清华大学开源软件镜像站 点 Date 按时间排序&#xff0c;根据自己 Mac 芯片类型下载对应最新版本的。 Intel 芯片的下载 x86_64 版本的Apple m1 芯片的下载 arm64 版本的 二、安装 Anaconda 将安装包下载到本地后&#xff0c;双击安…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...