后端基础04
一springBoost入门1spring创建一idea是旗舰版要钱的假设idea是旗舰版要钱的就直接在file选择new然后选择module模块直接选择spring boost然后选择maven还有jdk版本spring boost版本还有输入文件名设置文件存储的地址二idea是社区版免费的直接去官网https://start.spring.io/选择maven语言是java然后springboost版本号组织名字文件名...反正大概这个样子最后要选择Spring web这个是基础东西必须有2springboost快速入门代码大概就是这样子的基础入门小代码为什么直接运行这个小代码就可以在浏览器访问服务器//需要定义这个方法上一个请求类 RestController public class HelloController { //创建一个注解用于指定网址的路径 RequestMapping(/hello) //这个name就是前端传递回来的参数 public String hello(String name){ System.out.println(name : name); //返回给前端页面然后会在浏览器打印出来 return hello name~; } }原因就是我们引进来的jar包tomcat其实是一个已经实现的服务器只要有这个包然后运行代码那么就会启动这个编写好的服务器然后就直接可以连接上浏览器这个是java使用最多的服务器二http协议1http概念就是指定数据的传输规则这样浏览器就知道用什么格式发送给服务器服务器以什么格式解析2http在浏览器的开发者工具显示一请求类1第一行表示请求行第一个get表示发送数据类型请求路径http协议的版本号2第二行开始往下就是请求头以 键值 为结构3假设使用post方法发送数据那就还有请求体二响应类第一行响应的协议http然后1.1表示版本200表示类似响应码就表示响应成功第二行往下就是响应头以 键值 结构然后响应体被单独划分到另一个地方叫response返回结果hello heima3http协议请求数据一请求数据的格式请求行数据的第一行请求头以 key value形式以下就是请求头的key的意义请求体只有是post传递方式才有与请求体之间空了一行二请求数据的获取web服务器Tomcat对http协议的数据请求数据进行解析并封装到httpServletRequest在调用controller传递了该方法这样就不需要去处理因为tomcat已经处理好了//注解申明rest控制器 RestController public class requestController { //注解申明请求处理方法并且申明访问地址 RequestMapping(/request) public String request(HttpServletRequest request){ //获取请求的方式 String method request.getMethod(); System.out.println(请求方式method); //GET //获取请求的url地址完整地址 String url request.getRequestURL().toString(); System.out.println(请求url地址url); //http://127.0.0.1:8080/request //获取请求的uri地址用户填写的地址 String uri request.getRequestURI(); System.out.println(请求uri地址uri); ///request //获取请求协议 String protocol request.getProtocol(); System.out.println(请求协议protocol);//HTTP/1.1 //获取请求参数--name age String name request.getParameter(name); String age request.getParameter(age); System.out.println(name:name); System.out.println(age:age); //获取请求体--accept String accept request.getHeader(accept); System.out.println(请求体accept:accept); return ok; } }4http协议响应数据一响应数据的格式和请求的格式差不多就是响应行响应头响应体1状态码1XX就是客户端和服务端建立长时间的连接就会显示1XX的状态码2XX就是连接成功的意思常见是2003XX就是当前访问的方式错误但是服务端还是成功接收然后返回状态码3XX然后附加一个正确的地址local新地址然后浏览器自动访问这个新的地址不知道为什么没有成功看到可能是因为浏览器自带的保存查询的地址所以无法看到4XX就是访问不存在的地址常见就是4045XX就是服务器那一边出问题常见500响应头和响应体之间必须有一行空行二响应方式两种方式1获取http的对象HttpServletResponse然后设置其内容//方法一获取HttpServletResponse对象然后设置响应数据 RequestMapping(/response1) public void response1(HttpServletResponse response) throws IOException { //设置状态码 response.setStatus(HttpServletResponse.SC_OK); //表示200的状态码 //设置响应头 response.setHeader(Content-Type,heima); //设置响应体 response.getWriter().write(h1response ok/h1); }2直接设置自带的对象ResponseEntity使用链式结构设置//方法二使用ResponseEntity返回类型对象直接设置个对象就行 RequestMapping(/response2) public ResponseEntityStringresponse2(){ return ResponseEntity .status(200) // .header(Content-Type,bey) .body(h1response ok/h1); }注意状态码和状态头就不需要自己设置这些会自动设置而且假设自己设置有可能会出错三第一个前后端的小案例1案例的思路and后端逻辑案例用户通过查询对应的地址然后访问浏览器然后浏览器向服务端发送请求信息服务端就是我们的电脑然后读取到用户端的请求后在去自己本地的文件内获取数据将数据预处理读取数据切割数据然后存储到一个集合集合装着对象user然后直接返回给前端代码前端代码获取到服务器的数据后将数据进行解析然后输出显示到浏览器2显示到浏览器的原理将前端代码放置到idea编辑器的resource的文件夹下面然后放置到static文件夹能够显示到浏览器的原因就是因为这个是SpringBoost的框架实现的SpringBoost框架是将静态资源被浏览器访问到所以就会在所在的文件夹就是resource的文件夹下搜索文件static文件比如user.html文件然后将文件以http的形式传输到浏览器最后浏览器解析文件内容显示图像3后端代码的实现//使用注解表示获取用户的请求信息 RequestMapping(/list) //在前端有const result await axios.get(/list);表示请求的地址 public ListUser list()throws Exception{ //逻辑 //先获取本地文件的数据 //想要获取resource文件内的user的数据可以使用类加载器 //先获取当前的类的字节码然后获取其加载器然后在获取resource下user的文件 InputStream resourceAsStream this.getClass().getClassLoader().getResourceAsStream(user.txt); //使用第三方包hutool包来快速读取数据,参数一输入流参数二编码参数三集合 ArrayListStringlines IoUtil.readLines(resourceAsStream,UTF-8,new ArrayList()); //将数据进行切割然后封装成User对象 //使用stream流代码简洁一点 ListUser users lines.stream() .map(line-{//分割字符串然后将分割后的数据添加到对象user内 String[]userInfoline.split(,); Integer idInteger.parseInt(userInfo[0]); String usernameuserInfo[1]; String passworduserInfo[2]; String nameuserInfo[3]; Integer ageInteger.parseInt(userInfo[4]); LocalDateTime updateTimeLocalDateTime.parse(userInfo[5], DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); return new User(id,username,password,name,age,updateTime); }).toList(); //最后直接返回User对象所在的集合 return users; }4小问题为什么直接返回user对象的集合就能让浏览器接收到JSON格式的数据原因就是因为 RestController 的注解因为RestController 注解底层其实是两个注解合并在一起的ControllerResponseBody而ResponseBody就是关键注解能将数据转化为 JSON 格式的数据类型就是转化为 String 的集合作用会在SpringBoost的方法的返回值通过消息转化器将集合对象等等数据转化为 JSON 格式的数据再以 http 的形式将数据发送回前端四三层架构1层数的划分刚刚所写的代码是直接将所有功能都放在一起这样代码的复用性差代码的修改难度大所以需要将代码分成书写而刚刚实现的逻辑就有获取用户请求体and响应体数据的读取逻辑操作所以可以将代码分成三层就叫做单一责任原则而我们数据读取还可以创建一个接口来统一数据读取的结构同理逻辑操作也可以用一个接口来同一操作2代码实现这样实现能使代码结构更加清晰复用性好代码修改也简单impl的文件夹就是用来实现接口的实现文件dao就是数据的读取service就是逻辑操作比如对数据的预处理controller表示对用户端的响应和接收projo表示一些对象用于数据存储的对象SpringboostWeb01Application表示主方法运行这个就可以运行所有代码一读取数据的实现类//继承接口同一实现方式 public class daoUser implements dao { Override public ListString readInfo() { //先获取本地文件的数据 //想要获取resource文件内的user的数据可以使用类加载器 //先获取当前的类的字节码然后获取其加载器然后在获取resource下user的文件 InputStream resourceAsStream this.getClass().getClassLoader().getResourceAsStream(user.txt); //使用第三方包hutool包来快速读取数据,参数一输入流参数二编码参数三集合 ArrayListString lines IoUtil.readLines(resourceAsStream,UTF-8,new ArrayList()); return lines; } }二数据处理的逻辑实现部分public class serviceUser implements service { //创建dao的实现类 daoUser daoUsernew daoUser(); Override public ListUser handleInfo() { //需要先获取数据--所以需要调用刚刚创建好的daoUser类 ListString lines daoUser.readInfo(); //将数据进行切割然后封装成User对象 //使用stream流代码简洁一点 ListUser users lines.stream() .map(line-{//分割字符串然后将分割后的数据添加到对象user内 String[]userInfoline.split(,); Integer idInteger.parseInt(userInfo[0]); String usernameuserInfo[1]; String passworduserInfo[2]; String nameuserInfo[3]; Integer ageInteger.parseInt(userInfo[4]); LocalDateTime updateTimeLocalDateTime.parse(userInfo[5], DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); return new User(id,username,password,name,age,updateTime); }).toList(); //最后直接返回User对象所在的集合 return users; } }三用户的请求读取和响应//使用注解表示这个方法是获取用户的rest RestController public class UserController { //使用注解表示获取用户的请求信息 RequestMapping(/list) //在前端有const result await axios.get(/list);表示请求的地址 public ListUser list()throws Exception{ //创建刚刚实现的service对象 serviceUser service new serviceUser(); ListUser users service.handleInfo(); //最后直接返回User对象所在的集合 return users; } }五分层解耦1概念耦合就是衡量软件的 各层/各个模块 之间的关联程度内嵌软件中各个功能模块内部的功能联系2解耦原因原因刚刚实现的小代码内部各个代码之间的联系是通过 new 一个对象来实现的但是假设其中的一个代码的名字进行修改那么与之关联的代码也需要修改这样就是耦合性太高不便于后期代码的修改维护所以需要解耦减少耦合性增加关联性3解耦思路创建一个容器用于存储所有方法的对象统一管理然后假设需要使用某一个方法就不要使用 new 对象 的方法而是使用这个容器来获取对象控制反转简称 IOC对象的创建控制权由程序自身转移到外部容器依赖注入简称 DI容器为应用程序提供运行时所依赖的资源Bean对象IOC 容器中创建管理的对象称之为 Bean4实现先将类的上面添加一个注解Component注意是加在实现类上面的将new的对象去掉然后给需要使用其他类的上面添加一个Autowired5IOC分类和使用ioc容器可以分为四个componentcontrollerservicerepository四个容器但其实其他三个都是component的衍生假设不关注代码的实现目的都将注解写为component原则上是没有问题但是不符合规范最好还是按照代码的实现逻辑来选择注解注意声明bean的时候可以通过注解的value属性来指定bean的名字如果没有就默认是类名的首字母小写细节前面声明bean的四大注解想要生效需要被组件扫描注解ComponentScan扫描该注解虽然没有显示配置但是实际上已经包含在了启动类的声明注解SpringBoostApplication中默认扫描的就是启动类所在的文件夹及其子包的代码比如启动类的文件夹是com.itheima那么com.itheima下的子文件夹controllerdaopojoservice都有申明注解componentScan所以不需要再次手动声明6DI的使用分三种情况但实际开发最多使用第一种而springBoost官方推荐就是第二种主要看以后公司要求追求快速开发和简洁就使用第一种追求结构上的规范性和代码的逻辑性就使用第二种一DI 的使用选择假设某一个接口有多个类实现然后在另一个类内使用多态的方法调用这个接口其中还是用依赖注入那么依赖注入自己就不清楚哪一个类是我们真正要注入的那么代码就会报错那么就要声明我们要注入的类是哪一个方法有三个第一种只要标记的类上有这个注解那么假设有多个类实现同一个接口那么优先注入有这个标记的类第二种在调用其他类的接口上面就可以声明要注入的类是哪一个名字细节名字就是类名的首字母小写第三种和第二种一样就是你要注入的类你就先声明你要哪一个前提多个方法实现同一个接口细节名字要求一样首字母要小写以下是第二种方案我感觉这个可以使用的比较广以下是方法三二三个方法之间的区别1依赖注入的注解Autowired 默认按照类型自动装配如果同类型的bean存在多个PrimaryAutowired QualifierResource2Autowired 和 Resource 区别Autowired 是springBoost自带的方法注解Resource 是javaEE规范提供的Autowired 是根据类型进行匹配的Resource 是根据类名进行匹配的

相关新闻

2026年10款零代码AI开发APP工具盘点选择指南

2026年10款零代码AI开发APP工具盘点选择指南

2026年,软件开发正经历从“写代码”到“说需求”的范式转移。据行业数据,受AI低门槛开发模式普及的驱动,2026年第一季度苹果App Store全球新上架应用数量同比激增84%。从自然语言对话生成到零代码可视化搭建,AI正在将APP开发从专业…

2026/7/15 18:35:03阅读更多 →
C/C++预编译指令与宏定义:从原理到实战的完整指南

C/C++预编译指令与宏定义:从原理到实战的完整指南

1. 项目概述:预编译指令与宏定义的核心价值 如果你刚开始接触C或C,可能会对代码里那些以 # 开头的指令感到困惑。它们不是真正的C语句,却在编译过程中扮演着至关重要的角色。这就是预编译指令,而宏定义则是其中最常用、也最容易…

2026/7/15 18:35:03阅读更多 →
2026年10款对话式AI开发APP工具盘点选择指南

2026年10款对话式AI开发APP工具盘点选择指南

2026年,软件开发正经历着从“写代码”到“说需求”的范式转移。据行业数据,受AI低门槛开发模式普及的驱动,2026年第一季度苹果App Store全球新上架应用数量同比激增84%。从自然语言对话生成到零代码可视化搭建,AI正在将APP开发从专…

2026/7/15 18:35:03阅读更多 →
Optimizing Knowledge Utilization for Multi-Intent Comment Generation with Large Language Models

Optimizing Knowledge Utilization for Multi-Intent Comment Generation with Large Language Models

文章核心总结与创新点 一、主要内容 本文聚焦于多意图代码注释生成任务,针对现有基于大语言模型(LLMs)的方法在少量演示样本下难以构建意图、代码与注释间正确关联的问题,提出了名为KUMIC的框架。该框架基于上下文学习和思维链(CoT)优化知识利用率,通过两个核心组件实…

2026/7/15 19:45:08阅读更多 →
基于Game4Automation PRO的工业VR培训实战:从CAD到PLC的虚实联动

基于Game4Automation PRO的工业VR培训实战:从CAD到PLC的虚实联动

1. 项目概述:从PPT到VR,一次生产线培训的降维打击最近刚交付了一个给客户做的生产线VR巡检培训项目,用到的核心工具是Game4Automation PRO(简称G4A PRO)。项目做完后,客户那边的反馈就俩字:惊艳…

2026/7/15 19:45:08阅读更多 →
RCScore: Quantifying Response Consistency in Large Language Models

RCScore: Quantifying Response Consistency in Large Language Models

一、文章主要内容总结 该研究针对现有大语言模型(LLMs)评估过度依赖单一指令模板、忽视模型对指令风格敏感性的问题,提出了多维度评估框架RCScore,核心围绕“指令风格如何影响模型响应一致性与任务准确性”展开系统研究: 研究背景:现有LLM评估多依赖准确率、F1分数等传统…

2026/7/15 19:45:08阅读更多 →
深入解析TMS320C6654复位与时钟机制:从原理到实战避坑指南

深入解析TMS320C6654复位与时钟机制:从原理到实战避坑指南

1. 项目概述:为什么需要深入理解C6654的复位与时钟?在嵌入式系统,尤其是像TMS320C6654这样的高性能多核DSP的开发中,有两个基础但至关重要的环节常常被开发者视为“黑盒”:一个是系统如何从“无”到“有”地启动&#…

2026/7/15 19:45:08阅读更多 →
C++模块化实战:融合Legacy代码的渐进式迁移策略与避坑指南

C++模块化实战:融合Legacy代码的渐进式迁移策略与避坑指南

1. 项目概述:当模块化新潮遇上历史包袱 如果你正在用C23,或者至少关注着它的新特性,那么“模块化”这个词肯定让你又爱又恨。爱的是它承诺的编译速度革命、更清晰的代码边界和摆脱头文件地狱的曙光;恨的是,当你兴冲冲地…

2026/7/15 19:45:08阅读更多 →
Reasonix:提高LLM Prompt Cache的秘密

Reasonix:提高LLM Prompt Cache的秘密

做 AI Agent,很多人只关心「上下文塞得多不多」,但真正决定长对话体验的,是缓存命中率。 今天聊一套 Cache-first Agent 策略——让每一轮对话更快、更稳、更省。 核心逻辑很简单:前缀越稳定,Provider 越容易命中缓存…

2026/7/15 19:40:08阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
AI框架决定企业AI能走多远

AI框架决定企业AI能走多远

企业AI建设的第一性原理 企业搞AI,最关键的决定是什么?不是选哪家大模型,不是先做哪个场景,不是招多少AI人才——而是选哪个AI开发框架。 为什么?因为框架决定了企业AI能力的"天花板"。选对了框架&#xff0…

2026/7/15 0:01:30阅读更多 →
Java企业为什么需要AI框架

Java企业为什么需要AI框架

Java企业在AI时代的尴尬处境 Java是全球企业级应用开发的主流语言——全球超过一半的企业系统跑在Java上。但在AI浪潮面前,很多Java企业感到尴尬:大模型的接口是各种语言的,AI开发社区以其他语言为主流,似乎Java在AI时代"掉队…

2026/7/15 0:01:30阅读更多 →
CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

1. 项目概述:为什么需要关注CC3230x的SD主机、定时器与低功耗?在物联网和嵌入式设备开发领域,我们常常面临一个核心矛盾:设备需要具备强大的连接能力、可靠的数据存储和实时控制功能,同时又必须严格控制功耗以延长电池…

2026/7/15 0:01:30阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →