粉丝4.0万获赞20.8万

spring boot 自动装配的原理是什么?怎么构建一个自定义的 starter? spring boot 是 怎么集成 my maths 框架的?你有没有背过这样的面试八谷?只要是愿意背八谷,那你就有背不完的八谷。但我今天必须泼一盆冷水,如果你只停留在背诵的层面,那你永远只能做个底层的马龙。 spring 本身已经是一个极其庞大极其牛逼的生态了, spring 社区为什么还要在它外面套一层 spring boot 呢?这层壳到底封装了什么呢?搞懂了这个所有关于 spring 和 spring boot 的 面试题,你怎么说都是对的。 这一次我带你站在架构式的角度,好好梳理一下 spring boot 的 设计思想,跟着我的思路走, spring boot 才真算是入门了。另外,关于更多学习资料,我整理了这份两百万次的学习宝典,当中包含 java 所有主流技术站以及项目场景题,还有海量解密模板,需要的朋友留下 java 免费获取。 想要看懂 spring boot, 我 们必须找到一条主线, spring 已经很强大了,那 spring boot 要做些什么呢?仅仅只是把启动过程封装成一行 spring application 的 round 方法吗? 其实围绕 spring 容器启动前,启动中,启动后各个不同的阶段都有无数需要优化的问题,正是这些问题,才让 spring boot 无比的经典。 比如在容器启动前,各种乱七八糟的配置怎么去统一管理呢?容器启动过程中,一大堆的粗俗化代码要执行,你怎么知道它运行到哪个阶段了呢?容器启动后,怎么让开发者的感受更好?比如如果报错了,怎么让程序员快速看懂问题在哪? 当然,具体问题有很多, spring boot 的 所有核心封装就是围绕这三个阶段在展开的。接下来我们一个一个来看。首先是容器启动前,我们都知道 spring 跑起来需要大量的配置信息,以前写原声的 spring 呢,我们要配一大堆的插料,那 spring boot 是 怎么解决这个问题的呢?它没有去死磕怎么解析插料,而是做了一层极其漂亮的架构抽象, 它把所有的配置信息封装成了一个统一的 environment 对 象,而 spring boot 的 框架会负责将多个加载出来的 environment 对 象最终合并起来, say 给 spring 去加载各种乱七八糟的主键,你说这有啥用?其实这就是架构设计的魅力。 有了这层 environment 的 封装, spring boot 就 可以理直气壮说,我不管你以前配置写在哪儿,现在统统给我转移到我指定的 application 雅妙这种默认文件里来。当然,这还没完,你应该知道, spring boot 本身就指定了多个不同的配置文件,加载的目录与文件。但其实不管配置文件怎么花里胡哨,最终都只是需要加载出 environment 的 对象而已。 那我是不是可以从自定义的任意文件里面加载配置呢?哎,只要你想到了,要实现非常的简单,如果你这样尝试过,那可不可以把格局再打开一点?我可不可以通过网络从远程服务器上拉取配置,然后塞进这个 environment 里面? 有人抓住了这样的思想,于是 nike、 阿波罗这种分布式配置中心就诞生了,他们可以无缝接入 spring boot 乃至背后的 spring 体系,就是抓住了这个架构的扩展点。你看,搞懂了这种架构思想,那些高大上的中间件是不是瞬间就没有那么神秘了?甚至你也可以尝试动手去做做自己的配置中心,这可比背诵构建 start 的 十种技巧有意思多了吧。 接下来到了容器启动中,这个阶段有什么痛点呢?这里有两个我觉得最为奇妙的设计,一个是自动装配,还有一个就是事件监控。先说自动装配哦,你一定背过相关的面试题,但是你有没有想过 spring boot 在 这其中做了什么呢?它解决了 spring 的 什么痛点呢? spring 框架其实早就支持用 add, configuration 等一系列的注解来代替插槽进行注入了。 spring boot 是 怎么在架构上破局的呢? 它引入了以 springbankfortress 为基础的配置文件机制,新版本更形成了 import 文件。但是底层思想其实是相通的,通过这一层配置文件,把分散在各个价包里的零散配置内,全部集中到一个固定的配置文件里面,启动的时候,我一把说哈,全给你加载进来。 但这还不够,一大堆的组建,相互之间还有各种依赖,不就乱套了吗?于是 spring boot 在 此基础上记出了真正的杀招, add conditional、 on、 叉叉叉一系列的条件装配机制。通过条件装配机制,你可以自动管理相关的组建依赖。你引入了 readis 的 组建依赖,好,那我就自动帮你把 readis template 装配好。 但这个机制其实还有个更强大的功能在于,你可以在没有 readis 的 依赖的基础上,就可以去检查项目中有没有 readis 的 依赖,你就没法 import 对 应的类,那更别说后面的检查了, 这才叫约定大于配置。就是通过框架,把行业里的最佳实践当做约定提前写好,从而把你从繁琐的机械的组建、拼装工作中彻底解放出来。你要是学会了这种集中管理加条件触发的架构思想,以后去设计公司内部的基础脚手架时,能少走无数的弯路。 接下来是事件监控,打开你的 springboard 的 项目,在项目里面加入这样的一个类,然后启动你的 springboard 的 应用,你就能看到很多这样的日制了。 这些日制是什么意思呢?其实就是 spring boot 的 框架在应用启动的过程中,不断地往外发布各种广播事件,告诉你应用启动的哪一步了,而你只要做一个监听器,就能够接受到这些广播信息。 关于这个案例,我可以告诉你,只是接收到了 spring boot 应用中 spring 容器加载完成后的少数事件,而在 spring 容器加载前的一些事件,这个监听器它是接收不到的。这其实就是因为 add configuration 是 spring 房价中的注解,也就只有在 spring 容器加载完成后才能够生效。至于如何监听 spring 容器启动之前的事件,你能想到什么办法吗? 不妨在评论区说说,看看你这么多年的 spring boot 开发经验是不是花架子。接下来 spring 容器启动完了,并都加载了,这时候 spring boot 又做了什么封装呢?这里简单介绍 spring boot 提供的两个封装思路,一个是对异常信息进行封装,二呢是提供应用数据库 以前的加载应用,一旦容器失败了,控制台就会直接给你甩出几百行红色的异常站,找个错能把眼睛看瞎。所以 spring boot 封装了一套异常分析框架,端口占用了数据库连不上了,它拦截到底层异常,直接用大白话告诉你哪错了,下一步该怎么解决。 如果你的应用中定制了很多特殊的业务,那为了让运维有更好的体验,最好对每种边界情况定制一个异常类,再定制一个对应的 data analyzer, 让运维同学能一眼看懂问题出在哪里。另一个就是大家熟悉的 command line runner 和 application runner 这两个接口了。 spring boot 会在整个应用启动完成后,主动调用容器当中的接口实现类,完成一些粗俗的工作。 springboard 的 框架本身其实并没有提供对应的实现类,也就是说,框架本身其实并不需要只指这两个接口。那为什么还要这么做呢?其实这就是架构师们在系统准备就绪的那一刻,把系统的控制权优雅地交还给了开发者。 你需要加载缓存字典,你需要跑过自动化的脚本,没问题,实现这两个接口,容器刷新完立刻回掉,你既满足了你的业务需求,又不会破坏 spring 自身的生命周期,这就是架构设计的边界感。 为什么要搞这些细致墨迹的设计,其实就是一种优秀的架构设计思想。优秀的架构设计必须包含开发者体验,框架不仅要能跑,还要好用,这是架构师的同理心, 而这其实也是一个好的程序员成长的必经之路。什么样的代码才叫做好代码?并不是花里胡哨,别人看不懂的代码才是好的 spring boot, 这就是在给你一个最好的榜样。 当然, spring boot 这么经典的框架,细枝末节的精妙设计,那讲三天三夜也讲不完,而且你也不可能听得完,学得完。但是就看到很多人把这么经典的框架给说成了死板的八股文,我其实是非常失望的, 这也是为什么我很少出这些基础架构内容视频的原因。而且现在有了 java, 很多人感觉基础编程就不用学了,学个 ai 就 够了,甚至觉得找工作的逻辑就是,你敢给我多少的工资,我就能做多大的事情。只要有了 ai 技术,不用学我也是神仙。 但今天我说句难听的实话,对于百分之九十九的普通人来说, ai 它就只是一个工具,是个傻子都能用的工具。作为一个真正见过大风大浪的程序员,这东西你学的溜啊,你学个 spring ai 比起学个 spring boot, 那 简单不要太多了。 程序员的门槛从来就不只是敲几行代码而已,而是你解决问题的思路,是你面对复杂系统式的架构思维。就像我们今天分析的 spring boot, 它的价值不在于写了多少行代码,而在于它洞察到了配置反手的痛点,才用优雅的架构思想解决了它。 ai 是 什么? ai 只是一个把你这种思想放大的工具,如果你的脑子里面就没有对业务的理解,没有对架构的认知,没有解决问题的思路,那你用 ai 也只是比别人更快的生成一堆垃圾代码而已。 所以,只要找准了方向, spring 这么经典的框架,也能够催生出 spring boot 这样同样优秀的框架,只要你的思想在你的方向对, ai 就 永远只是你的小弟,而你才是那个掌握权重的架构师。

下一个报上名来,包括容器。大哥,我是 user service。 我是 被拗出来的,快让我进去干活。拗什么拗啊,懂不懂规矩在我这你得先有户口本啊,这叫 bin definition。 你 的这个 scope 是 单立的还是圆形的?是懒加载的还是计时加载的呀?你都可以告诉我啊。我不,我就想被注入一下。以前入门实战那本书里边没这么说呀。 你也知道那叫入门啊,现在是高级架构厂,没有兵定义师,我怎么知道怎么实力化呢。啊,我怎么知道怎么跟你创业啊,去后面排队去 later。 大 哥,户口上好了啊,我现在能作为一个完整的兵进去了吧。想得美, 实力化只是第一步,还得验证你的这个属性,把你的属性给你填充了,还得通过 aware 接口回调啊。最重要的,你是个 service, 你 还得走后置处理器的调用啊,你还得让他处理一下不是。哪有那么麻烦呀,我都户口了。我都有户口了。不经过后置处理器的处理,你就是个废柴啊, 怎么做动态代理啊,怎么做自动装配人呢啊,行吧行吧,这会流程走完了啊,这会东西都全了啊,有搞过生命周期吗?我熟啊,别急啊,还得带个面具。把这面具给我带上啊, 以后干活的时候啊,你就是你的替身。嗯,这也太复杂了,那边那个新来的家伙,他怎么不用那么麻烦啊。啊,那个,那个是 spring ai 啊,新来的宠,我们要拥抱智能化。所以呢,人家是个例外,给他开了绿色通道。 荣熙大哥,你这套路也太深了,又是生命周期又是后置处理器,还有 aop 原型和 ai, 我 脑子都不够用了呀。脑子不够用了你就来看看我的新书啊。 这本书里边讲了 b, 讲了 a o p, 讲了 i o c, 容器,讲了 ai 啊,你读懂了它,你就掌握了 spring 和 spring boot 的 精髓啊。呐,你看吧。

寄予 springboard 的 旅游信息咨询网站。

一分钟教你用 ai 完成壁设。第一步,将你的需求文档通过附件上传到豆包,然后让它提取核心开发提示词给 q o 的, 然后复制全部输出提示词。 第二步,教你从 idea 从零创建项目开始,这里我们要创建一个空的 spring boot 项目,接下来要勾选 web 和 sql 依赖。 第三步,把豆包生成提示词粘贴到 idr 的 q o 的 插件中,检查删除多余提示词,回车 ai 扭码开勾项目完整,前后端代码完整,输出中耗时时间根据项目复杂度而定,大约十分钟。第四步,复制生成的数据库脚本 粘贴到 data group 中执行,检查一下数据库和表星球是否完成。第五步,启动后单项目,查看控器台是否有错误信息。第六步,进入前单项目目录下,执行 mvm install 和 mvm run down, 便会输出项目访问地址。 最后就是测试阶段了,系统整体要细和功能还是非常完善的,制作不易,希望对兄弟们有用,兄弟们的点赞和关注是我创造的动力,感谢!

那先来给大家介绍一下什么是框架,因为 spring 它的全称呢是 spring from work from work, 翻译过来是框架的意思,那我会把大家呢当做还没有学过任何一框架,是学了 java 的 一些最基本的入门的语法,还有包括 solo 的 gsp 这些最基础的知识。 那我有必要给大家先介绍一下什么是框架,那框架你可以把它理解成,比如说你现在要去住一个房子,那你用了框架 就相当于你选择了这个毛坯房。而如果你不用框架呢,就相当于你要一砖一瓦的去盖房子。那首先毛坯房他给我们提供了我们所需的一些最基本的结构和规范, 省去了我们一砖一瓦从零开始建房的一个繁琐的工作。这在我们开发当中呢,你可以把它理解成我们要开发一个应用,它已经给我们搭建了最基础的一些设施。 那 spring 它给我们搭建了什么基础的设施呢?我们待会儿会来给大家去讲。好吧, 那一个框架他肯定是能够节省我们的工作量,提升我们的开发效率的,那 spring 他 肯定也具备了这样的一个工作。并且假如说我们从零开始一砖一瓦的去构建这样的一个框架的话,你首先 安全问题会出,对不对?因为你不是专业的,所以说假如说我们从底层开始就去搭建这个框架,有可能会出现一些 bug, 不 稳定,对不对?所以说我们肯定会去使用一个框架来作为我们的一个应用最基础的一个设 施,那基础设施有了之后,我们只需要在这个基础上去开发我们的业务功能就可以了, 所以说我们以后去开发一些企业级的应用,都会应用到各种各样的框架,当然一个框架是成不了事的, 我们通常会用好几个框架组合一起好不好?几个框架组合一起使用,那么我们又有另外一种名叫做架构,就比如说我们后面要学的这个 s m 组合起来,它可以称之为是一个架构。 好吧,但是 spring 这个框架呢?它可以说是整个架构当中最底层的,你可以把它理解成这个房子的整个结构。那比如说你以后要住进去,你肯定要去集成其他的框架,比如说要集成一个门啊,要集成窗户啊, 都得依赖这个最基础的它的一个结构。好吧,所以说我们 spring 它是一个框架,并且是所有框架当中最基础的,最重要的这样的一个框架。 ok, 那 什么是 spring 呢?这个问题在面试的时候有可能会被问到,我们一定要知道啊,大家注意我问的是什么是 spring, 没有问什么是 spring 框架, 那单纯问 spring 它的含义就比较广了。首先 spring 它发展至今已经有二十余年的一个历史了, 它已经发展成了一个生态体系,已经是一个家族了,你不能单纯地就把 spring 等同于一个框架, 这是一个错误的一个理念。好吧,我们可以打开 spring 官网 spring 点 i o, 从这个 projects 里面我们可以看到 spring 整个生态体系,它的全家桶所有的产品。那这里呢,有一句话我给大家介绍一下,他说从配置到安全 或者 web 应用,再到大数据,无论你的需要什么基础设施来去构建你的应用, spring 都可以帮助你去构建它, 所以说 spring 它发展至今已经不单单的只是一个框架了,而是一个完整的生态体系。这个生态体系呢,可以帮你构建一个应用当中所有的基础设施 是非常牛逼的。所以说当面试官问你什么是 spring, 你 的格局要打开啊,它现在发展至今已经是形成了一个生态体系,它可以帮你构建一个应用当中所有的一个基础设施。 但是呢,话又说回来,在大多数情况下,我们说 spring 呢,它指的就是 spring 框架, 但是你在回答这个问题的时候,你一定要先提到他发展至今已经形成了一个生态体系,好吧,再来说他是 spring 框架,然后再去介绍什么是 spring 框架, 那我们就再来介绍一下什么是 spring 框架。在介绍之前呢,我再来给大家提一下他的整个发展历程是什么? 好来给大家讲一下 java web 架构的一个演变过程。能使用 spring 这个框架呢,基本上都是去开发一个 web 应用,那 web 应用它的架构演变过程呢, 我们还是得要知道一下的,因为你以后去公司碰到一些比如说十来年的这个程序员, 那你肯定要跟他对得上话,对不对?虽然我们以后去公司基本上 都是使用这两种架构方式,那之前用到的架构呢,其实我们还是得知道一下的,好吧, 那 spring 这个框架呢,它并不是说开天辟地就有的啊,它也是慢慢慢慢演变过来的,那它是在哪一个气机 下面诞生的呢?我们来先来介绍一下,在最早的时候,当我们没有使用任何一个框架的时候呢,我们去开发一个外部应用,我们通常是使用 select 加 gsp 这样的一个技术呢来进行开发, 那这样的一个架构呢?就会造成什么问题呢?我们所有的,包括比如说我举个例子,我发起一个登录请求, 登录请求发起之后来到我们的后端 sublet, sublet 呢?它会得到我们的用户名密码是不是? 那拿到用户名密码之后呢?会去数据库查询,看有没有这条记录,有的话返回,然后表示登录成功,给它跳转对应的 gsp, 如果没有数据库返回,那么就给用户显示登录失败,然后再返回对应的 gsp, 是 这样的一个过程,对吧?那在这个过程当中,包括我们的跳转页面啊,我们的这个业务逻辑 判断对吧?判断用户名是否错误等等这些以及呢?数据库查询我们通通都会写在 select 里面, 甚至有些项目啊,连 solo 的 都不用,直接写在 gsp 里面,直接用这种监控百分号的方式在里面去写抓代码,我不知道大家见过这种项目没有啊?徐老师在十多年前就写过这样的项目,所有的代码都写在 gsp 里面, 那这样的情况就会造成你一个类里面要负责的功能就非常非常的多, 那我们后期要去维护,要去扩展的话,基本上你是很难再去动他了,所以说他的维护性是非常差的,那我们就想办法呀, 你一个类负责的事情太多,那我就创建多个类出来嘛,它们各自负责不同的一个职责,对不对?那这个时候我们的 web 这个 mvc 三层架构就衍生出来了, 那么就通过不同的层,就比如说 web 层,它负责页面的跳转跳转,然后呢业务逻辑层, 也就是我们的 service 层,它负责业务逻辑的一些判断,然后呢,我们的数据库访问层,它负责数据库的一个操作, 它们之间呢形成了一个调用链,对吧?当一个请求来到 solut, solut 它会调用业务逻辑相应的一个类,然后业务逻辑呢,再调用数据访问对应的一个类,对不对?最终卡进数据库, 那么这是我们的三层架构,当然我们通常呢还会引入 mvc 的 这样的一个架构思想,那我这个 mvc 呢,主要是应用在这个 web 层,好吧? mvc 它主要是应用在这个 web 层, 这个 web 层呢?首先 m 五呢,它是 model, 对吧?它主要的体现就是我们的 port 类,就像我刚刚说的,比如说一个登录请求进来, 你要携带用户名密码,对不对?那用户密码我们就可以给它封装到一个 user 对 象里面,那这个 user 对 象呢?啊?就充当这个 model, 对 不对?因为假如说用户密码,这是两个参数对不对?如果说参数非常多的话, 那如果十个参数,你要在业务逻辑层、数据访问层之间传递的话,其实是非常麻烦的。所以说我们通常呢会用一个 po 对 象给它封装起来,这是 model 的 一个体现, 那么 v 呢?是 view 视图对不对?视图呢?就是 gsp 的 一个体现了。然后呢,还有这个 c c 呢?是这个很 call 了。 控制器,那控制器呢?是由 server 来去负责, server, 它负责你跳转到哪一个对应的 gsp, 好 吧,所以说在 web 层呢,引入了 mvc 的 一个架构思想, 那么这样的一个架构思想呢?其实是比较成熟的一个架构思想啊,这对于我们后期去做维护的话,其实还是职责比较清晰的,对吧?比如说我要去修改一条 sql 语句, 那大家告诉我去修改哪个层?肯定数据访问层对不对?所以说这样对于我们后期维护的话会更加的清晰了。但是呢类变多了之后,那么我们类跟类之间他们就存在一个藕合的这样的一个关系, 那其实对于我们的一个程序来说,对象跟对象之间他的藕合度应该越低越好, 也就是我对象跟对象之间他们的这个依赖关系应该越松越好。这样的话,对于我,比如说我要换掉某一个对象,其实是更加的简单的,当然这个你可能现在无法感受的到, 那后续当我们学了 spring 你 就知道了,好吧?也就是比如说我给大家举个例子,就比如说我在发起一个请求登录, 我要把用户名密码传到业务逻辑层,我肯定要怎么样?我要去在这个 server 里面,我要去拗一个业务逻辑层的一个对象,比如说 user service 对 不对?那么我要在 user service 里面去掉数据层对应的一个方法,去访问数据库,那么我要去拗一个数据访问层对应的一个对象,拗一个 user 到对不对? 那么这些对象的创建其实就是我们类跟类之间它们的一个藕合关系了。那如果说我们能把这个创建对象的 这个这个这个工作啊交给一个容器单独去管理的话,那么它们之间的这个关联关系呢?就会降低,好吧?藕合度呢就会降低,那这个时候 e g b 他就是负责这功能,也就是他负责帮你呢去创建这些对象,然后统一管理起来,然后比如说你的业务逻辑层, 好吧?你就比如说你的 solet 要去 new 一个对应的 us service, 我 们程序员我们不自己 new 了,而是交给 egb, 这个我们不深入的去讲了,大家稍微了解一下,也就是我们对象跟对象之间的这个 依赖,这个藕合度就降低了。但是用 e g b 的 话,它的侵入性太强了,这里涉及到很多的名词,你可能没有接触过,好吧,那如果说 你哪一个没有听懂,感觉比较模糊,没有关系,因为我们这些技术呢,其实都是已经过时的好不好?那么这个 e g b 我 刚说侵入性太强了,怎么样算侵入性强呢?也就比如说我有个 user service, 我要实现这个 egb 这个框架的话,我必须要实现它的某一个接口,或者说呢,我要 b 成它的某一个负类,这样才可以实现,这种我们就称之为侵入性太强了。哪一天我想把这个框架给它换掉的话, 就基本上不可能,因为你要改改动代码,肯定会非常非常的多好吧?并且 e g b 它实现起来也非常的麻烦。所以说 spring 它的作者就意识到了这个问题,他觉得你这个 e g b 用起来也太不好用了吧? 那他就自己开发出来了这样的一套,用来解决你层跟层之间的这样的一个藕合关系,那么 spring 它就诞生出来了, spring 诞生出来之后呢,大家一用哎,确实要比 e g b 好 用,所以说 e g b 呢,就淘汰掉了,那么随着 好吧,随着我们的技术的一个更新迭代,因为大家知道我们技术它是会不断的更新的, 对不对?那么在这个三个层呢,就衍生出来了一些优秀的对应的一些框架,因为我们之前三层都没有用到框架嘛,比如说数据层,我们访问数据库直接用 gdp c, 对 吧?我们的这个 web 层 要去接收用户请求以及跳转页面,我们都是通过 server, 其实呢是比较麻烦的, 那么就演就就衍生出来了一些优秀的框架来负责各自的一个啊,这个功能你像 web 层就由 stress 来去负责,你像请求的接收啊,页面的跳转啊, 通过 stress 来做的话,要比我们单独用 select 要简单了一些啊。还有呢,我们去查询数据库,如果我们去写 gdbc 的 话,那也非常的麻烦,因为 c d gdbc 我 们每次都要创建一个连接,对吧?然后呢等等很多的步骤, 那么我们用 havenet 这个框架去实现的话,就会变得更加的简单。 那么这里每一个层跟层之间它们的一个依赖关系呢,就由 spring 来去解决,也就是像我刚刚说的,你的这个 web 层要去调用 service 层,那你需要另一个 user service, 对 吧?那你的业务逻辑层要去掉数据访问层的对象,你要去拗一个对应的 user 到,那么这些工作啊,拗对象的这些工作通通交给 spring 去做了。 当然我们现在稍微介绍一下,大家脑子里面有个印象,我们后续再讲到 spring 对 应的一些核心知识点的时候,你就会彻底地感受得到, 好吧,也就是把这些创建工,创建对象的工作交给 siri 去做,那么就形成了我们最早期的这样的一个 ssh 的 这样的一个架构。那么这个架构呢,当时也是风靡一时啊,我们称之为三大架构,基本上你会这个东西找工作不用愁, 不像现在这么卷了。然后呢,就当然随着市场的技术也不断的革新, 然后呢,这些个框架它也暴露出来了一些问题,你像 stress, 它不断地出现,不断地出现一些 bug, 知道吧?然后呢,呃,使用起来 也比较麻烦。当然啊,如果说你在单纯的只用 server, 没有用任何一个框架的时候, stress 它用起来还是比较好用的,但是呢,跟 spring 提供的这个 spring mvc 一 比啊, 它就没有这么好用了,所以说后续呢,这个 web 层就被 spring mvc 给替代了, 当然 spring c 我 们后续会详细的去讲解,好吧。然后呢,这个数据访问层用 happenet 当然也不是不可以,其实国外啊,他们就喜欢用 happenet, 因为它去实现数据库操作的话,还是比较快的。 但是呢,在对于我们国内的话,我们国内通常业务会比较复杂,我们中国是一个人情社会,对不对? 业务呢,就会更加的复杂,那业务复杂的话,我们的 circle 语句就会更加的复杂,你用 habit 要实现一些复杂的这样的业务场景的话, 那对于这些复杂的 circle 语句实现起来是更加的困难的,所以说我们用 my base 就 用的比较多了, 所以说随着我们技术的一个革新呢,就演变成了 ssm 的 这样的一个架构。 但是就像我刚刚所说啊,架构呢,它是不断地去演变的,因为你用 ssm 架构,你每创建一个项目出来啊,你都要去搭建一个 ssm 这样的一个架构, 知道吧?就好像你每次盖建,你每次盖一个房子,你都要去钢筋水泥啊去搭建, 你要做大量的这些基础设施的这些配置的工作,那 spring bud 他 就意识到了,他说你的这些基础的搭建你不要管了,我直接这样,我直接给你拖一个房子过来, 你直接用 spring boot 就 行了。所以说当我们使用 s s m 去搭建 搭建这样的一个架构的时候呢,我们需要用到大量的这些 xml 的 配置文件, 知道吧?那我们使用 spring boot 这些配置都不需要去做 spring boot, 它帮我们做了,好吧,当然我们后续去讲 spring boot 也会详细地去讲到, ok, 那 并且徐老师在我们本系列课程啊,我也会基于 spring boot 来教你 s s m 这三个换价, 我不会像现在很多的一些呃,视频里面单独的再去教你基于 xmail 的 这种呃 spring 的 直用方式了,因为那种基本上已经过时了好不好,现在更多的是基于 spring boot 的 来去开发我们的 sm 框架, ok, 所以 说基本上你现在去公司的话,也都是基于 spring boot 来去开发我们的 ssm 框架。 这个你先暂时了解一下,你可能现在感受不到这些这些架构都是我第一次听说过,对吧?稍微打一个照面就行了,以及我刚刚说的这个演变过程,你能稍微知道就行了,并且 spring boot 它后续呢,也会跟随着你的公司业务不断的更新,对吧?然后业业务量不断的扩大,你 spring boot 的 也会慢慢的去 更新出其他的一个架构,当然不会像我们 e g b 成为 s s h s h 成为 s s m 这么大的一个翻天覆地的这样的一个革新了。 基本上你像 spring boot 去更新 ssm, 它都是基于 ssm 来开发。 好吧,它不会说我完全的把你换掉,所以说我们后续的技术革新呢,也都是基于 spring boot 来的, 所以说学好这一套是非常的重要的。好吧,那我就不重复的给大家去说了,我们后续一个一个的去学这些个框架你都能感受得到。 好,来给大家讲一下 java web 架构的一个演变过程。能使用 spring 这个框架呢,基本上都是去开发一个 web 应用, 那 web 应用它的架构演变过程呢?我们还是得要知道一下的,因为你以后去公司碰到一些比如说十来年的这个程序员, 那你肯定要跟他对的上话,对不对?虽然我们以后去公司基本上 都是使用这两种架构方式,那之前用到的架构呢,其实我们还是得知道一下的。好吧, 那 spring 这个框架呢,它并不是说开天辟地就有的啊,它也是慢慢慢慢演变过来的,那它是在哪一个气机 下面诞生的呢?我们来先来介绍一下。在最早的时候,当我们没有使用任何一个框架的时候呢,我们去开发一个外部应用,我们通常是使用 select 加 gsp 这样的一个技术呢来进行开发, 那这样的一个架构呢?就会造成什么问题呢?我们所有的,包括比如说我举个例子,我发起一个登录请求, 登录请求发起之后来到我们的后端 sublet, sublet 呢?它会得到我们的用户名密码是不是? 那拿到用户名密码之后呢?会去数据库查询,看有没有这条记录,有的话返回,然后表示登录成功,给它跳转对应的 gsp, 如果没有数据库返回,那么就给用户显示登录失败,然后再返回对应的 gsp, 是 这样的一个过程,对吧?那在这个过程当中,包括我们的跳转页面啊, 我们的这个业务逻辑判断是吧?判断用户名是否错误等等这些以及呢数据库查询,我们通通都会写在 select 里面, 甚至有些项目啊,连 solo 都不用,直接写在 gsp 里面,直接用这种监控百分号的方式在里面去写抓代码,我不知道大家见过这种项目没有啊?徐老师在十多年前就写过这样的项目,所有的代码都写在 gsp 里面, 那这样的情况就会造成你一个类里面要负责的功能就非常非常的多, 那我们后期要去维护,要去扩展的话,基本上你是很难再去动他了,所以说他的维护性是非常差的,那我们就想办法呀, 你一个类负责的事情太多,那我就创建多个类出来嘛,它们各自负责不同的一个职责,对不对?那这个时候我们的 web 这个 mvc 三层架构就衍生出来了, 那么就通过不同的层,就比如说 web 层,它负责页面的跳转跳转,然后呢业务逻辑层, 也就是我们的 service 层,它负责业务逻辑的一些判断,然后呢,我们的数据库访问层,它负责数据库的一个操作, 它们之间呢,形成了一个调用链,对吧?当一个请求来到 solut, solut 它会调用业务逻辑相应的一个类,然后业务逻辑呢,再调用数据访问对应的一个类,对不对?最终卡进数据库, 那么这是我们的三层架构,当然我们通常呢还会引入 mvc 的 这样的一个架构思想,那我这个 mvc 呢,主要是应用在这个 web 层,好吧? mvc 它主要是应用在这个 web 层, 这个 web 层呢?首先 m 五呢,它是 model, 对吧?它主要的体现就是我们的 port 类,就像我刚刚说的,比如说一个登录请求进来, 你要携带用户密码,对不对?那用户密码我们就可以给它封装到一个 user 对 象里面,那这个 user 对 象呢?它就担当这个 model, 对 不对?因为假如说用户密码,这是两个参数对不对? 如果说参数非常多的话,那如果十个参数,你要在业务逻辑层、数据访问层之间传递的话,其实是非常麻烦的。所以说我们通常呢会用一个 po 对 象给它封装起来,这是 model 的 一个体现, 那么 v 呢?是 view 日图,对不对?是图呢,就是 gsp 的 一个体现了。然后呢,还有这个 c c 呢?是这个很宽了 控制器,那控制器呢?是由 servata 来去负责 sublot, 它负责你跳转到哪一个对应的 gsp, 好 吧,所以说在 web 层呢,引入了 mvc 的 一个架构思想, 那么这样的一个架构思想呢?其实是比较成熟的一个啊,架构思想啊,这对于我们后期去做维护的话,其实还是职责比较清晰的,对吧?比如说我要去修改一条 sql 语句, 那大家告诉我去修改哪个层?肯定数据访问层对不对?所以说这样对于我们后期维护的话会更加的清晰了。但是呢类变多了之后,那么我们类跟类之间他们就存在一个藕合的这样的一个关系, 那其实对于我们的一个程序来说,对象跟对象之间他的藕合度应该越低越好, 也就是我对象跟对象之间他们的这个依赖关系应该越松越好。这样的话,对于我,比如说我要换掉某一个对象,其实是更加的简单的,当然这个你可能现在无法感受得到, 那后续当我们学了 spring 你 就知道了,好吧?也就是比如说我给大家举个例子,就比如说我在发起一个请求登录, 我要把用户名密码传到业务逻辑层,我肯定要怎么样?我要去在这个 serverlet 里面,我要去拗一个业务逻辑层的一个对象,比如说 user service 对 不对?那么我要在 user service 里面去掉数据层对应的一个方法,去访问数据库,那么我要去拗一个数据访问层对应的一个对象,拗一个 user 到对不对? 那么这些对象的创建其实就是我们类跟类之间它们的一个藕合关系了。那如果说我们能把这个创建对象的 这个这个这个工作啊交给一个容器单独去管理的话,那么它们之间的这个关联关系呢?就会降低,好吧?藕合度呢就会降低,那这个时候 e g b 他就是负责这功能,也就是他负责帮你呢去创建这些对象,然后统一管理起来,然后比如说你的业务逻辑层, 好吧,你就比如说你的 select 要去 new 一个对应的 user service, 我 们程序员我们就自己 new 了,而是交给 e g b, 这个我们不深入的去讲了,大家稍微了解一下,也就是我们对象跟对象之间的这个 依赖,这个藕合度就降低了。但是用 e g b 的 话,它的侵入性太强了,这里涉及到很多的名词,你可能没有接触过,好吧,那如果说 你哪一个没有听懂,感觉比较模糊,没有关系,因为我们这些技术呢,其实都是已经过时的好不好?那么这个 e g b 我 刚说侵入性太强了,怎么样算侵入性强呢?也就比如说我有个 user service, 我要实现这个 egb 这个框架的话,我必须要实现它的某一个接口,或者说呢,我要 b 成它的某一个负类,这样才可以实现,这种我们就称之为侵入性太强了。哪一天我想把这个框架给它换掉的话, 就基本上不可能,因为你要改改动代码,肯定会非常非常的多好吧?并且 e g b 它实现起来也非常的麻烦。所以说 spring 它的作者就意识到了这个问题,他觉得你这个 e g b 用起来也太不好用了吧, 那他就自己开发出来了这样的一套,用来解决你层跟层之间的这样的一个欧核关系,那么 supreme 它就诞生出来了, supreme 诞生出来之后呢?大家一用,哎,确实要比 e g b 好 用,所以说 e g b 呢,就淘汰掉了,那么随着 好吧,随着我们的技术的一个更新迭代,因为大家知道我们技术它是会不断的更新的, 对不对?那么在这个三个层呢,就衍生出来了一些优秀的对应的一些框架,因为我们之前三层都没有用到框架嘛,比如说数据层,我们访问数据库直接用 gdp c, 对 吧?我们的这个 web 层 要去接收用户请求以及跳转页面,我们都是通过 select, 其实呢是比较麻烦的, 那么就演就就衍生出来了一些优秀的框架来负责各自的一个呃,这个功能你像 web 层就由 stress 来去负责,你像请求的接收啊,页面的跳转啊, 通过 stress 来做的话,要比我们单独用 select 要简单了一些啊。还有呢,我们去查询数据库,如果我们去写 gdbc 的 话,那也非常的麻烦,因为 c d gdbc 我 们每次都要创建一个连接,对吧?然后呢等等很多的步骤, 那么我们用 havenet 这个框架去实现的话,就会变得更加的简单。 那么这里每一个层跟层之间它们的一个依赖关系呢,就由 spring 来去解决,也就是像我刚刚说的,你的这个 web 层要去调用 service 层,那你需要另一个 user so 意思对吧?那你的业务逻辑层要去掉数据访问层的对象,你要去 new 一个对应的 user 到,那么这些工作啊, new 对 象的这些工作通通交给 spring 去做了。 当然我们现在稍微介绍一下,大家脑子里面有个印象,我们后续再讲到 spring 对 应的一些核心知识点的时候,你就会彻底地感受得到, 好吧,也就是把这些创建工,创建对象的工作交给 siri 去做,那么就形成了我们最早期的这样的一个 ssh 的 这样的一个架构。那么这个架构呢,当时也是风靡一时啊,我们称之为三大架构,基本上你会这个东西找工作不用愁, 不像现在这么卷了。然后呢,就当然随着市场的技术也不断的革新, 然后呢,这些个框架它也暴露出来了一些问题,你像 stress, 它不断地出现,不断地出现一些 bug, 知道吧?然后呢,呃,使用起来 也比较麻烦。当然啊,如果说你在单纯的只用 server, 没有用任何一个框架的时候, stress 它用起来还是比较好用的,但是呢,跟 spring 提供的这个 spring mvc 一 比啊, 它就没有这么好用了,所以说后续呢,这个 web 层就被 spring mvc 给替代了, 当然 spring c 我 们后续会详细的去讲解,好吧。然后呢,这个数据访问层用 happenet 当然也不是不可以,其实国外啊,他们就喜欢用 happenet, 因为它去实现数据和操作的话,还是比较快的。 但是呢,在对于我们国内的话,我们国内通常业务会比较快的,但是呢,在对于我们国内,通常是一个人情社会,对不对? 业务呢,就会更加的复杂,那业务复杂的话,我们的 circle 语句就会更加的复杂,你用 habit 要实现一些复杂的这样的业务场景的话, 那对于这些复杂的 circle 语句实现起来是更加的困难的,所以说我们用 my base 就 用的比较多了, 所以说随着我们技术的一个革新呢,就演变成了 ssm 的 这样的一个架构, 但是就像我刚刚所说啊,架构呢,它是不断地去演变的,因为你用 ssm 架构,你每创建一个项目出来啊,你都要去搭建一个 ssm 这样的一个架构, 知道吧?就好像你每次盖建,你每次盖一个房子,你都要去钢筋水泥啊去搭建, 你要做大量的这些基础设施的这些配置的工作,那 spring bud 他 就意识到了,他说你的这些基础的搭建你不要管了,我直接这样,我直接给你托一个房子过来, 你直接用 spring boot 就 行了。所以说当我们使用 s s m 去搭建 搭建这样的一个架构的时候呢,我们需要用到大量的这些 xml 的 配置文件, 知道吧?那我们使用 spring boot 这些配置都不需要去做 spring boot, 它帮我们做了,好吧,当然我们后续去讲 spring boot 也会详细地去讲到, ok, 那 并且徐老师在我们本系列课程啊,我也会基于 spring boot 来教你 s, s, m 这三个换架, 我不会像现在很多的一些啊,视频里面单独的再去教你基于 excel 的 这种啊, spring 的 智用方式了,因为那种基本上已经过时了,好吧,现在更多的是基于 spring boot 的 来去开发我们的 ssm 框架, ok, 所以 说基本上你现在去公司的话,也都是基于 spring boot 来去开发我们的 ssm 框架, 这个你先暂时了解一下,你可能现在感受不到这些这些架构都是我第一次听说过,对吧?稍微打一个照面就行了,以及我刚刚说的这个演变过程,你能稍微知道就行了,并且 spring boot 它后续呢,也会跟随着你的公司业务不断的更新,对吧?然后业业务量不断的扩大,你 spring boot 的 也会慢慢的去 更新出其他的一个架构,当然不会像我们 e g b 成为 s s h s s h 成为 s s m 这么大的一个翻天覆地的这样的一个革新了。 基本上你像 spring boot 去更新 ssm, 它都是基于 ssm 来开发。 好吧,它不会说我完全的把你换掉,所以说我们后续的技术革新呢,也都是基于 spring boot 来的, 所以说学好这一套是非常的重要的。好吧,那我就不重复的给大家去说了,我们后续一个一个的去学这些个框架你都能感受得到, 那我们要学习 spring, 就 必须要先从这个核心 i o c d i 开始学起。 l c d i 是 什么?我们接下来会详细的去讲解,好吧,首先我们要知道它是处于 spring 框架当中核心容器模块里面的, 所以说它是我们 spring 框架当中最核心的,对,最核心的,为什么这么说呢?我们看一下这个模块之间它们的一个树结构图啊, 处于树干的位置呢,就是我们的 l c d i 核心容器。你像其他的模块, web 呀, spring vc 啊, a o p 啊, spring gdp 啊,事务啊,它们都需要依赖这个核心容器, 所以说我们要学 spring 框架就必须要先学这个 l c d i 好 吧,因为其他的模块都依赖于它。那什么是 i o c 和 d i 呢?它们呢?其实是两个名词, ioc, 它的全称呢是 inversion of ctrl, 翻译过来是控制反转。 d i, 全称呢是 dependence injection, 翻译过来依赖注入。当然我们单纯的从字面意思来看呢,其实非常难理解,对吧? 甚至有些工作了两三年的小伙伴呢,可能都没有办法非常好地去解释这个 ioc 和 d i, 但是在面试的时候呢,经常会被问到啊,所以说我们一定要知道这两个概念它是什么意思, 那接下来呢,徐老师就给你介绍一下,好吧,然后我还会结合一个生活当中的这个非常容易理解的一个案例来带着你去理解,如果再理解不了的话,我们待会通过代码去理解,我相信你一定能够去掌握它。好吧, 那 ioc 它是控制反转,虽然字面意思很难理解,其实我们可以把它进行拆分一下,控制它控制了什么呢?它控制的是对象的创建的权力被反转了, 怎么理解呢?我举个例子啊,就比如说一个 user service 类需要用到另外一个类它的对象,比如说 user service 要用到这个 user 到这个类的对象,那我们通常呢 会怎么做呢?我们是不是就在 user service 这个类里面去拗一个 user 到,对不对?我们通常都是这么做的, 但这样呢,就会让这两个对象产生一个强关联,或者叫做强藕合,他们之间呢就建立了强藕合的一个关系。 那么我们写代码要知道代码之间他们的藕合度越高,对后期的一个维护扩展的话就越不利。 就比如说我这个 user 到哪一天我要换掉它的话,我就必须要来到 user service 这个类里面,把这个代码给它换掉,对不对? 当然我们感觉很容易,但是你要知道,如果说有几十个地方都用到了这个 user 到呢?你是不是要改几十个地方啊,对不对?在我们代码里面呢,有一句话叫做再小的代码变更都有可能会引起 bug 的 一个可能性。好吧,再小的代码变更都会引起这个 bug 的 可能性。 你像我们最近老是出现,比如说滴滴挂了,对不对?阿里云挂了,淘宝挂了, 其实就是因为最近这些大厂裁员,然后把一些相关的人裁掉了。可能呢?呃,有些人动了之前的一些人的代码,有可能你改了一个非常小的地方,就会引起这个连锁反应,最终 导致程序整个都不可用,引起一个程序的血崩效应。所以说对于我们一个程序来说, 你作为后期维护能尽量的去不改它的代码是最好的。那你想尽量不改代码,肯定要尽量的去降低我们代码之间的一个偶合性,那怎么降低呢? 这个是我们之前,对吧?之前在没有用到 ioc, 我 们直接这样这样写代码,那我们要降低它的偶核呢?我们就可以这样来做,我们就可以采用这个 ioc。 好 吧,我们让 spring, 然后我们这是改造之后,用了 spring 之后,我们利用 spring 来去创建这些对象,比如说 user service, 我 让 spring 给我去创建 user 到,同样的我也让 spring 给我去创建,然后 user service 里面要用到 user 到呢,我让 spring 去注入进来, 那这怎么实现?当然我们不是自己去写代码去实现啊,这自己去写代码就复杂了去了。所以说 spring 它利用这个 l、 c、 d i 呢,就帮我们实现了这一块。 比如说我们在某一个对象里面要用到 spring 管理的这个 user 设备时,我们就需要依赖 spring 注入给我们,那这个就是 di 的 概念了好不好?所以如果我们需要用到 spring 管理的对象,那就需要呢依赖 spring 注入给我们,那这就是这个 d i 的 这个概念了啊,好吧,这就是依赖注入了。 所以 ioc 呢,就是控制反转,控制对象的创建权力,之前呢,由我们程序员 控制对象创建对吧?我想在哪创建,我就直接去 new 一个对象就完了,那现在呢?我程序员不能自学 new 了,我需要依赖 spring 注入给我们,好吧?现在需要依赖 spring 注入给我们,所以说他的这个对象的创建权力被 spring 给反转了,能不能理解?好吧, 那这个呢,就是 ioc 控制反转和依赖注入它的一概念。当然你听完之后呢,可能有些同学不是百分之百的能理解,毕竟还没有写代码嘛,对不对?但是我觉得你只需要有一个初步的认识就可以了, 那我再结合一个我们生活当中的案案例来帮助你来去理解,好吧?就比如说这是你,然后呢,你看中了一个女孩,那你想去追她,你要追她的话,你肯定呃要依赖很多的一些条件,对吧?比如说你要有车有房有票子, 那有了这些之后呢,你再去追他,成功率就会更高,对不对?那追上了之后呢,你们就会建立一个强藕合,那么如果说建立上强藕合之后呢?比如说结婚了,好吧,就相当于建立了强藕合,就比如说哪天要离婚, 那你要造成的损失肯定会非常大,对不对?就像我们刚刚说的,你对象跟对象之间建立了强藕合之后,如果说我要换掉这个对象,那肯定就需要改代码,对不对?那这里呢,你如果说分手了或者离婚了,你肯定要损失很多东西。 那如果说我们引入 supreme 的 这个 iocdi, 由 supreme 呢去管理这些个对象, 好吧?那这里呢,就是由,比如说一个按摩院,好吧?他呢管理这些对象,他去创建这些对象,将这些对象提前管理好。 那你现在要拿一个对象呢,只需要来到这个 spring 容器里面,让它注入一个给你就完了, 对不对?那你下次要换一个的话,你也可以只需要呢告诉 spring 容器你要哪一个对象,它就可以再次的注入给你。所以说在这个之间你们的藕合度就降低了,能不能理解 通过这个例子呢?你们觉得 l c, d i 它的优点是什么呢? 它们有什么优点呢?是不是最主要就是完成了这个解偶啊,对不对?但除了解偶呢,其实 spring 容器呢,它还帮我们统一管理了对象, 这对象的创建还有他们之间的这个依赖呢,都不需要我们去维护了, spring 它会帮我们维护好,对吧?你哪天哪一个不干了, 那你你我我也不用担心啊,对不对?我下次去找另外一个就行了。所以说这个对象的创建和他们之间的一个依赖关系都由 spring 统一去管理,我们不需要去关心, 好吧?并且呢它管理之后呢,还提供了很多的一些功能给我们,就比如说某一个对象我只会创建一次 这个,我们比如说这个 user service, 我 如果说好几个类里面都用到了这个 user service, 我 会 new, 如果是之前的话, 我会拗好几个 user service 对 不对?那你要知道,我们每次拗一个对象呢,就会在内存当中开辟一块空间用来存这个对象,对不对? 那我拗的这个对象同一个对象拗的越多,我要开辟的内存就越多。那如果让 spring 统一去管理的话,它可以为你呢只创建一次, 也就是这个 user service 这个类型呢?我只创建一次,那这样呢,就可以节省我们内存的一个开支,是吧?当然这属于设计模式当中的一种,设计模式有二十三种,它是属于这个 单立设计模式。好吧,那 spring 帮我们管理对象,它就用到了这个单立的设计模式,当然你也可以改成每一次用到都去给它创建一次。 好吧,所以说 spring 他 帮我们管理了这些对象之后呢,还给我们提供了更多好用的一些功能,帮我们提升我们程序的一个性能, ok, 就 比如说这个女孩的类型 对吧?清纯的她只会招一个进来,是不是这样就避免了?呃,这个这个不同类型的女孩对吧?你多样化,你可以选择性很多, 是不是?所以说有一个容器统一来管理这些对象呢,是能够更加方便地去管理的, 好吧,好在之前我们讲了很多关于 spring 相关的一些概念,就是为了接下来呢,我们去搭建一个 spring 框架,来实现这个 iocd i 相关的功能,大家呢能够更好地去理解相应的一些代码。 那接下来呢,我们就基于 melvin 来快速地去搭建一个 spring 六的一个框架。 那么废话不多说啊,大家要准备的一些前置东西呢,包括 jdk 一 十七,因为 spring 六,它最低的 jdk 版本是一十七,然后我们要准备 melvin, 如果有不懂 melvin 的, 可以去看一下徐老师之前讲的 melvin 相关的系列课程。然后呢 我们的开发工具是 idea。 好 吧,那接下来呢,我们就去先创建 melon 项目,好吧,我们先不扯上 spring, 我 们单纯的呢,先创建一个 melon 项目,我们创建一个 spring, 那 spring 系列课程相关的代码呢?我都会放在这个 spring 的 雾霾项目当中,好吧,我们采用这个聚合的方式呢,来管理我待会 spring 相关的所有代码,这样呢方便同学们去查看。好吧, 那这里 jdk 选择一十七,然后我们这里 group id 呢,可以改成我们自己对应的,然后 create。 那么我们这个 spring 工程呢,它是作为赋 melon 的 一个聚合的这样的一个工程,它是用来管理 spring 工程,所以把它的 s, r c 代码给它删掉, 它不放具体的功能代码,好吧,然后把它的打包方式 package 把它设置为 poem 代表呢,它是一个聚合赋 melon 项目 完了之后呢,我们来创建一个 zameon, 那 么我们就叫 hello 吧, 然后呢直接 create 好, 那以后我们每一节课对应的这些代码,我都会放在这个 spring 的 这个 spring 项目当中,那大家拿到代码就会很方便。好吧,你只需要呢 去打开我到时候给你们的这个 full menu 项目,好吧,您只需要拿到 我给你们的这个 full menu 项目,到时候你们打开这个 spring, 那 么里面的代码就都能够看到了, ok, 非常方便。好,那接下来呢,我们去搭建相应的一些代码,我们之前讲到 spring, 它的作用呢,是为了降低我们业务对象,对象跟对象之间的一个藕合,对不对?那我们就先从这个例子呢来给大家讲解。我们先来创建 user service, 把它放在这个 service 包里面, 然后我们再来创建一个 user 到, 然后呢我们再来去添加一个单元测试的一个方法,好吧, user 啊,我们就直接 test 吧零一吧。然后呢,我们去添加一个单元测试的方法, 所以说我们需要加入 gunit 它的依赖,我们把这些多余的依赖这几属性呢给它去掉,这也没有用,好吧, 我们加入 gunit 它的依赖。当然如果朋友们你们这里没有提示的话,你们可以去 melvin 的 中央仓库去看一下 gunit 它最新的版本是什么,然后你再给它加进来就行了。好吧, 这个 unit 版本没有太大的关系,我们通常用它最新的一个版本就可以了,然后我们就可以呢去使用 test 渡劫。 那么在以前呢,我们要用这个 user service, 我 们就会直接去 new 一个 user service, 对 不对?这样去用,然后呢,比如说我要去调用它里面的一个方法,比如说 get user 吧,随便的举个例,好吧, 然后在里面呢,我们就会去声明一个 user service, 那 接下来呢,我们要进行数据库查询,对不对?那数据库操作的代码我们会放在 user 到里面,所以说我们会在这里呢去 new 一个 user 到,这是我们以前的写法,对不对? 然后呢, get user 到, 当然我这里是一些伪代码,对吧?通常呢 get user 到,你肯定要返回一个 user, 那 这里呢,就执行我们的呃 查询用户的相关的一些数据库的操作,那这里呢,我就不去实现了,好吧,因为我们以后去执行数据库操作呢,我们会通过 mybase 来进行实现,我们会去改造。所以说这一块, 呃,根据大家所掌握的知识呢,可能只用只能用这个 gdp c 来进行实现,对吧?那这里呢,不是我们的重重点,我们就直接输出一个 hello spring 就 行了好不好? 好, ok, 那 这是我们以前的一个代码对不对?现在呢跟 spring 还没有任何的一个关系,这个代码应该大家都能看懂,对不对? 但是就如我们之前所说,此时呢我的 user service 跟 user down 呢,它们之间产生了一个强关联,对不对?那么产生了这个强关联或者偶合度过高, 如果我们没有使用 spring, 我 们会怎么去降低它的偶合性呢?我们通常呢会面向接口来进行编程, 也就是如果说这个 user 到它换掉了的话,现在我是不是要把这两个类都换掉啊,对不对?那如果说面向接口编程的话,我们是能够降低一定程度的这个藕合度的,就比如说我们只需要换它的实线类就行了,我给大家演示一下, 那此时呢,我们就可以创建一个 i user 到的一个接口, 我们让这个 user 到呢去实现 i user, 然后这 get user 呢?我们作为接口的方法去实现。好吧,我写上 override 呢, 就代表我当前这个方法是实现于接口,呃,那么一开始呢,它可能会报错,对不对?那么我们这要通过代码提示告诉它呢,你在 i user 到里面帮我去创建一个方法,这样呢,它可以自动生成,好吧, 那这样呢,我就可以通过 i user 到呢来去接收 user 到这个实线类,对不对?哪一天这个 user 到这个类换掉了,比如说换成 user 二到,对不对? 那我们只需要怎么样?只需要把它的实线类给它换一下就可以了,所以说面向接口编程呢,是可以降低我们对象之间的一个藕合度的 啊,我相信大家可能之前都写过相应的这种三层的代码,对吧?啊?我们的业务逻辑类,还有我们的这个数据访问类,我们通常都会加一个接口,很多同学呢可能理解不了,其实面向接口呢,它是可以降低饱和性的,并且可以提高我们的一个扩展性的, 对不对?如果说他有另外一个实现类,你只需要换他的实现类就可以了,当然这是在我们没有引入 spring, 我们想要降低偶合度的一种方式,对不对?但是这样的代码呢,他们之间依然存在这个强偶合,也就是我优色到换了,我依然要改这里的代码,对不对?所以说我希望能够 无动任何的代码,能够把这里的这个实线给它换掉,那这样它们的藕合度呢,就基本上是完全解藕了, 那现在目前是做不了的,我们只有通过 spring 的 这个 ioc d i 才能进行完成。 那接下来呢,我们就来实现一下 spring 的 这个 i o c d i, 那 接下来呢,我会通过 spring 三以下的这个 excel 的 配置方式呢 去实现,好吧,然后呢还会结合 spring 三以上的版本 来实现。那么最终我们课程呢,会主要给大家讲解 spring boot 的 这个方式来实现, 那么这三种方式啊,其实市面上也都有在用,你像这种呢,这种它主要是你像以前的这种老的 ssm 的 项目,目前呢也有在用的, 那么这两种呢,主要就是我们 spring boot 会用的这种方式,所以现在主流呢会用这种方式来进行使用,所以说许多老师会讲解这种基于 spring boot, 我 们来学习 spring, 好 吧,那 spring boot 很多同学可能,哎,老师你都不单独去讲 spring boot 这个课程,你就你就带着我去创建,我告诉你,其实 spring boot 非常的简单, 你不需要花太多的时间去学它,好吧,跟着徐福老师来走。那么首先呢,我们来先实现这种方式,基于 spring 以下的这个 xmail 的 一个配置方式, 那么接下来呢,我们就在 resource 里面去创建一个 xmail configuration field, 一个配置文件, 那么这个配置文件的名字呢?我们就叫它 spring, 好 吧,然后呢,我们可以怎么样?我们可以把这个 user 到和 user service 给它配置成一个 bing, 什么是 bing 呢? 就是我们现在呢,需要让 spring 帮我们去扭这些对象对不对?并且对象之间的这个依赖也让 spring 帮我们 进行组织,那我们就需要啊,告诉 spring 哪些类需要交给 spring 去 new, 我 们可以通过这个并标签来去配置,好不好? 那么我们就告诉 spring 啊,你帮我去给我扭一个 user service, 然后呢你再帮我去扭一个 user 到, 那么 spring 他 就知道了哦,你要让我帮你去扭这两个类的对象, ok, 那 他就会帮我们去扭, 并且呢我们的 user service 这里不是要使用 user 到吗?那接下来呢,我们不自己去应用了,我们让 spring 去录入进来,交给 spring 注入。好吧,就说白了,我们就依赖依赖 spring 注入嘛,这个就是 d i 的 一个体现,怎么注入呢?我们就可以在 user service 里面呢,给它设置一个 property, 那 么它的 name 呢?就是这个 user 到,当然啊,我们需要把它的 get see 的 方法呢,给它声明一下, 好吧,因为它是基于属性我们的 getc 的 属性来进行注入的,所以说我们要提供 getc 的 方法给它,然后呢,我们需要注入的 user 到呢,就是下面这一个,对不对?那么我们可以声明一个 name, 那 么在上面呢,我们就可以引用这个 user 到了,同志们,那么这里呢,就进行注入, ok, 那 这样呢,我们就已经把我们的这个两个类的对象交给 spring 帮我们去 new 了,并且我们对象当中依赖的另外一个对象, 我们依赖 spring 呢,帮我们进行注入了,对不对?那在这里呢,我们就不需要,我们就不需要自己去 new 它了, ok, 就 这样就配好了,基于 spring 的 这个 ioc 的 实现呢,我们就已经完成了,那接下来呢,我们去测试一下,那测试怎么做呢?同样的这个 user service 啊,我们也不能自己去 new 了,因为你自己去 new 的 话, spring 它是不会为你去注入这个 user 到的。我们现在要依赖 spring 为我们去注入呢,那我们就需要从 spring 的 这个容器里面去获得这个 user service, 而不是我们自己去拎这个 user service 了。好吧, 我们要依赖 spring 注入呢,就需要呢从 spring 容器中获取这个 user service, 那 怎么从 spring 的 容器中获取 user service 呢?那我们可以创建一个 spring 容器,叫做 class house。 呃, class 我 看一下啊, class class pass, 哎, class 我 找一下啊。 application 我 看一下,怎么没有呢? 依赖 application, 我们来刷新一下啊,这个类引用不到。刷新一下, 依赖已经加进来了,对不对?我看一下,我现在 ok, 没问题啊。 application, context, 哎,怎么没有呢? 我们来,我们来给它重启一下啊,可能是有一些缓存,大家遇到这种莫名其妙的问题呢,可以重启一下。 idea, 好,重启完之后呢,我们再打上,你看,现在就有了,所以大家如果遇到这种莫名其妙的问题啊,可以重启一下。好吧,因为 idea 它有时候会出现这种莫名其妙反应不过来的一些错误。好吧, 好,我们去 new 一个这个 spring 的 容器,这个就可以把它当做是 spring 容器,那么我们刚刚交给 spring 管理的这些类的对象, 通通都可以从这个容器当中去获取,当然前提我们需要把这个 excel 呢也得交给他,好吧, 然后呢,我们就可以从这个容器当中获取这个 user service 了。当然啊,我们通常呢也会去加一个接口,面向接口编程,对不对? i user service 当然在这里呢,那你虽然这个接口如果不加的话,其实也不影响,但是我为了更加贴切我们实际当中的开发,好吧,我们通常呢会加一个接口, 那么这个方法呢,我们是从负这个接口当中去实现的。 ok, 那 么在这里呢,我们就去获得这个 user service, 这个 user service 类型的 总是莫名其妙的反应不过来啊,这个代码怎么回事啊? 我再重新打一遍啊。 i user, 哦,有,有了有了,好, ok, 那 么现在呢,我们就拿到了这个 user service, 我 们去 调用一下它的这个 get user 方法,那么我们现在执行看一下,看 user service 里面有没有把这个 user 到给我们注入进来,如果正常的执行了,它输出了,对不对?那我们的这个 i o c d i 就 已经实现了,那大家可以看到 我此时我的 user service 跟 user 道呢,它们之间其实是没有强关联的,对不对?我如果说我把想把这个 user 道它的实线给它换一下呢,我只需要在这里呢加上这个 i, 这个 user 二道,对不对? 然后把这个引用呢,在这里给他改一下就行了,实际上我的代码他们之间是没有任何的强关联的,对不对?当然有的同学可能会说,老师你这里,你这里还不是得去改吗?你不要急,我们待会呢会可以一句都不要改, 好吧,大家可以看到,是不是我这里呢就是这个 user 二道输出出来的,所以说我们通过一这个控制反转依赖注入呢,就可以实现它的一个解偶了。 好,那在之前呢,我们就基于纯 excel 的 这种配置方式呢,来实现了我们 spring 框架的 ioc 功能,但这种方式呢,肯定是不好的,对不对?很多同学看到这里可能已经就不想用这个 spring 框架了, 这样用多麻烦啊,对不对?我一个类的对象,我就得配置一个这样的病,那如果说我以后有几十个上百个呢?我一个项目对不对?那我得配置多少个?这维护起来也非常的麻烦啊, 所以说这种方式呢,我们基本上已经不怎么去使用了,这种方式呢,实际上也是 spring 第一个版本推出来的一种方式, 那么接下来呢,我就带着同学们去眼背一下,演变到我们的二点零基于注解的方式呢,来实现我们的这个 spring。 那 以前呢,一个类的对象,我们就要配置一个 b 的 标签对不对?那通过注解的话,我们只需要 在这个 lay 的 上面加一个 homonethe 注解,代表呢它是一个 spring 的 病,好吧,那么这个就表示 homonethe 注解呢,就表示当前标识也可以啊,表标识当前 lay 呢,交给 spring 去 new, 好 吧,简单一点来说,通俗一点来说就是这个意思, 那么官方一点来说呢,它就会交给 spring 进行管理,好吧,它是一个 spring 的 主键, 或者呢叫做并 ok。 那 么同样的,我们的 usos 上面呢,也加上括号呢?代表呢它需要交给 spring 进行管理。 那么这两个类加上注解之后呢,你需要在 xml 里面去告诉 spring 注解所在的类它的包在哪里啊?要不然 spring 它怎么知道呢?它不可能说把所有的类都去扫描一下,看有没有这个注解吧,所以说你要告诉 spring, 好 吧,这个注解所在的包在哪里?我们先把这些配置给它去掉, 告诉 spring 注解所在的包在哪儿,怎么告诉它呢?我们通过这个一个叫做 component scan 控 pull component scan 设置这个包路径,那他们要是你,你会怎么设置啊?设置 come 点徐树点到吗? 而设置到和 u service 设置两个,我们肯定是设置它的外层,对吧?因为外层就已经凹行了,我们注解添加的这两个类对不对?所以说我们直接设置 com 虚数 就 ok 了,那这样呢,我们就不需要去写这么多这些个并配置了。 ok, 那 我们这个已经把这两个类交给 spring 帮我们已经用了,但是呢,这个 user service 依赖注入的这个属性怎么做呢? 那我们可以这样做,甚至可以把这个 get c 的 方法都给它去掉了,对吧?之前太麻烦了,那我们可以直接通过一个 alt y 的 注减来去让 spring 给我们自动注入进来, spring 它就会根据你标注的这个类型,我们是一个 i use 到,对不对?去 spring 的 容器当中呢?去根据这个类型去找, 那当找到这个类,这这个类型的话,他就会呢给你自动录入进来,能明白吧?那就这么简单,就几个注解,然后告诉 spring 你 注解所在的包在哪里就 ok 了。那么接下来我们再运行一下, 对吧?没有问题。就比如说现在我想把 user 到,我想把这个 user service 注入的这个 user 到给它改成这个怎么做呢?我们只需要把 user 到的这个 component 给它去掉, 给它换成 user 二到加一个 component, 那 么此时它的实现呢?就是 user 二到了, 看到没有?所以说通过这种方式呢,我们就可以不需要变更之前的任何代码,就可以把他依赖的这个对象给他换掉,是不是这样就完全达到了代码的一个松懈?和 我们这种方式呢,也是一些 s s m 的 项目呢?呃,最常用的一种方式。好吧,那大家这种方式一定要去掌握,客户呢,也一定要去实现一下。 那虽然我们基于注解的方式来实现 spring 的 ioc, 大家可能觉得已经非常好用了,但是我告诉你啊,它其实还只是 spring 二的一个版本提供出来的,我们现在学的是什么? spring 六对不对?中间相差了这么多版本, 他帮我们难道没有做改进吗?肯定做了呀,对不对?所以说接下来呢,我们再基于这个 spring 三的这个版本呢,让它基于我们的 java 类的方式 来去实现我们的这个 spring ioc, 也称之为 java config。 java 配置类的方式来去实现我们的这个 spring 的 ioc。 来,我带着同学们去实现一下。那现在呢,我们的这个 xmail 啊,就可以说完全不需要了,好吧,它已经完全没有用处了,你甚至可以把它删掉都没有关系,那我们需要做的是 新建一个 java 类来代替这个 xmail 配置文件,我们就叫 my, 呃,我们就叫 spring config 吧, 好吧,然后我们放在一个 config 的 包里面,那么这个类就用来代替 xml, 好 吧,这个配置类就用来代替 xml, 怎么代替啊?我们通过一个 configuration 注解, 就表示呢等于 xmail 的 配置文件,好吧,这样呢,就等于 xmail 的 配置文件了。 那么我们同样的也要像这个 xmail 一 样,告诉 spring 它要扫描的包位置在哪里。那我们可以这样通过一个 homepage scan 注解,那么这个注解呢,它其实就相当于我们的这个标签了, 就等于这个标签了。那么同样呢,我们呢要去设置它的这个 value, 你 看到没有,它的这个 value 呢,实际上就是这个 base package 的 这个属性,那我们只需要在这里呢去指定我们的包名 com 虚数, ok, 那 么这样的一个 java 类呢,就可以代替掉 xml, 这个 xml 呢就可以不用用了,但如果你不用 xml 的 话,你这个 spring 的 容器啊,这一句代码没有用,好吧,你这个 spring 的 容器呢, 就也不能用这个 classpath xml 的 application client 了,因为它是 xml 基于 xml 配置的一个容器,那我们就需要使用另外一个容器, 叫什么呢?叫做 annotation or figure application context, 把它给换掉,换完之后呢,你这里肯定也不能去指定一个 x mail 配置了,你应该指定什么?你应该指定一个配置类了,就我们刚刚的这个 spring config 的 配置类, ok, 那 么这里我们不需要改,依然从 spring 容器当中呢获得这个 user service, 它依然呢会根据你标记的这个注解为我们进行自动注入。来,我们来运行一下这个 test 二方法, 对吧?完全没有问题。那么这种方式呢,就是基于我们最新的这种 java config 的 方式来去实现我们的 spring 框架。 那么我告诉大家,其实我们以后要学的 spring boot, 它也是基于这种方式来去实现,那我们后续呢,会主要通过这种方式来给大家讲解 spring, 好 吧, 好在之前呢,徐老师通过不同的方式来带了大家实现了 spring 框架的这个 ioc 功能。 我再给大家总结一下这三种方式它们的一个利弊。首先呢,第一种是基于 spring 第一个版本的纯 excel 配置的这种方式,这种方式呢, 我们如果想让对应的这个类交给 spring 进行管理,也就是让 spring 帮我们去 new 这个类的对象,那我们就要去给它配置成一个 b, 对 吧? 那如果说我们要配置的并非常多的话,那这个配置文件里面的信息肯定是非常的多,也不利于我们后期的一个维护开发效率也非常的低,对吧?因为你当去编辑这个文件,你都要花很多的时间,对不对? 所以说 spring 它意识到这个问题之后呢,它就在第二个版本在 xml 的 基础上支持了注解的这种配置方式。这种方式呢,我们只需要在 xml 当中去配置一个扫描包,然后告诉它扫描的包路径, 那么它就会通过你这个包的路径呢,去扫描这个包下面所有的类,一旦发现你类里面有个 component 注解,那它就会把当前的这个类呢交给 spring 去管理,也就是把当前这个类呢配置成一个并,也就是帮我们去 new 这个类的一个对象。 那这种方式呢,其实就改善了之前第一个版本很多的问题,至少我们不用再大量的去编写这些个信息了,对不对? 但是呢, spring 它还想更加的精简化,在 spring 三的版本当中呢,它就推出了这种配置类的这种方式加注解的方式。 那基于配置类的方式呢,我们只需要一个 java 类就可以代替掉以前的这个 xml 配置文件, 并且呢也是非常简单易学的,因为它是直接面向对象来进行编程的,对吧?我们不再需要去管这些复杂的 xml 的 这种口头的语法是不是? 所以说这种 java config 的 方式呢?它是目前最新版本的一种使用方式,也是 spring boot 的 它只用的这种方式。那这种三种方式大家会用哪一种呢? 我相信一个正常的人,他应该都会用这一种,对不对?因为这种他确实语法更加的精简,也更容易学。是不是 谁想去在 xmail 里面去去去写一些这样的配置信息啊?我相信大家应该都不去,都不愿去想,对不对?但是我告诉你,基本上全网它去教 spring 的, 也都是基于 xmail 的 这种方式来去教你使用 spring, 但是这种方式呢,学术老师也不反对好吧,因为确实基于 xmail 你 去学 spring 的 话,它也更加的全面,因为 xmail 里面有的东西呢,加 config 它不一定有, 但是 x mail 里面的东西,它虽然更加的全面,但其实它有些东西我们以后是用不上的。 java config 里面的东西呢,基本上都是实用的东西,基本上学了我们都是以后用得上的东西。 我们学完这种方式呢,是可以直接无缝地集成到 spring boot 的 来进行开发的好吧,所以说这种方式去学 spring 虽然比较全面, 但是呢,它其实是会浪费我们的很多的时间,因为我们以后去开发一个 web 应用呢,也基本上是用 spring boot 的, 当然也不排除有一些老项目好吧,像 ssm 啊, ssh 啊,它会采用这种方式, 但是这种方式和这种方式它们之间的区别,无非就是使用了配置类代替掉了 xmail, 对 吧?但是我相信如果你学了配置类的这种方式, 是能够停替到 xmail 的, 我相信你学了这种配置类的方式, xmail 我 相信你应该也会去使用的。 当然有的同学可能会说,老师我不会,如果你不会的话,我告诉你,你可能不适合做程序啊,你要知道现在的 ai, ai 当道了对不对?像这种东西,比如说我问一下 ai 基于 spring boot, 我 怎么用这个注解的方式来换成 excel 呢?它肯定会告诉你对不对?所以说,如果说 你看了这个注解,你基本上我相信你稍微,对吧,稍微花一点点时间,你是能够立马能够平替过来的, ok, 所以 我觉得呢,没有必要每一种方式都去学习。 ok, 所以 徐树老师会带大家去学习这种机抓孔 fig 的 方式来学习我们的 spring。 好 吧, 那既然去把抽象的方式我们都学上了,为什么不直接学 spring boot 呢?所以徐书老师基于大家一个学习成本来考虑的话,我会带着大家呢, 从 spring boot 出发去学习我们的 spring spring mvc mybeates, 相当于呢,你学 spring 的 时候就顺带把 spring boot 的 一部分就已经学会了。好吧,所以说 这这样的学习成本大家也是更低的,所需要耗费的时间呢,肯定是更少的,现在都 spring 六了,对不对?你像一二的版本,我真的不建议大家再去使用了, ok, 所以 说大家如果当然你有兴趣的话,徐书老师之前在我我之前的版本讲 spring bud 二,我都讲过, 大家有兴趣还是可以去学一下,但是我还是那句话,现在都 spring 六了,你如果还去学 excel 的 配置,我觉得有点 out 了,有点浪费时间了。所以接下来呢,徐老师就基于 spring boot 来带着大家快速启动我们的 spring 应用。 那有同学可能会说,老师,这么快吗?你才刚带我入门入入门玩 spring boot, 我告诉你, spring boot 它学起来其实非常的简单。好吧,你如果掌握了我这三种方式, 你用 spring boot 再去实现 spring 框架的 ioc 功能,它只会更加的简单,不会更难。 ok, 那 我在这里呢,就稍微用一两句话给你说一下, spring boot 它到底是个啥东西啊? 你待会用完之后,你就立马就知道了,你都不需要我说 spring boot 是 个啥东西。好吧,你看 spring 官网, 在 spring boot, 你 看一下它的图标是个什么?是个开关键,对吧?这个开关键意味着什么?它可以一键地去启动我们的 spring 应用,好吧,它可以快速一键地去构建我们的 spring 应用, 所以说它对于我们构建一个 spring 应用,帮我们节省很多的工作量。 ok, 待会我带着大家去用一下,你就能够明白了。 所以说 spring 的 这个图标其实设置的非常的传神啊,你看包括这个 spring 的 图标,你看它这个所有的东西围着这个 spring 去转,对不对? 包括所有的第三方框架,所有的框架你都要集成到 spring 上面去, spring 呢,也帮我们管理了很多的对象,所以它这个图标你会发现所有的东西都要围着 spring 去抓,对吧?你还包括你来到 spring 的 首页,你看它这里有一句话说, 通过 spring boot 来去开发你的应用的话,只要简短的几句代码就可以构建一个服务,对不对?那如果你是刚入门,刚接触 spring 的 话,你可以尝试通过这种方式来进行快速的入门。 所以说不管是 spring, 不 管是 spring 官网还是徐树老师,都建议大家直接通过 spring boot 来学习我们的 spring, 包括 spring vc。 好 吧,这种方式呢, 是比较科学的,也比较节省大家的一个学习成本。 ok, 好, 那我就废话不多说了,接下来呢,我就带着大家基于 spring boot 来快速地去创建一个 spring。

spring boot 里面啊,有一个很重要的点,就是 spring boot 的 自动装配啊。呃,你能跟我讲一下它是怎么去做的?嗯,我记得就是加了个 spring boot application 它的一个注解,然后它就自动帮我们把所有需要的配置都给加载好了。 嗯,那它怎么去加载的呢?就是它怎么去知道我要加载哪些类?嗯,然后哪些是我需要的,它是怎么去判断的?这我还真没有仔细研究过。首先啊,你得先搞懂啊,就是自动装配到底是什么? 说白了就是 springboard 为了去遵循我们约定大于配置的原则,你只要引入了相对应的 start 依赖,它就会自动地把相关的变量给你注册到 ios 容器里面。好,它就能够去很快速地去整合一些框架,比如说像 release 等等,那你不需要去写一堆的参数配置了。如果你担心简历上的东西讲不出来, 我已经把面试经常问到的一些技术站场景题都整理在两百万字的面试文档了,里面针对每个知识点都有很详细的解析思路, 只要你是我的粉丝,留言六六六就可以打包带走。它的整个流程呢,其实你可以分为四步去加,第一步,核心注解,开启开关,也就是在启动内里面我们会去加一个 spring boot application 的 注解,那么这个东西呢,其实就是一个组合注解核心有三个。第一个呢,就是 spring boot configuration, 本质上就是一个 configuration 注 解,说明启动内啊本身就是个配置类好啦。第二个就是 come point sky, 扫描你自己写的代码里面的 ah, come point, service 这些注解,那把这些病呢,给我装进去好啦。第三个啊,就是我们自动装配的核心注解啊,就是 enable auto configuration, 那 么这个开关加了以后,我的自动装配呢,它才会生效好。第二步就是加载所有的自动配置类 and boot configuration 里面啊,它会去导一个 auto configuration input selector 的 类。这个类呢,会去读取所有驾照报下面的 smilde factory 文件,当然新的版本呢,它就有专属的 input 文件了。这个文件呢,就是它会把所有官方提供的一些自动配置啊给我 列出来,比如说 webmvc 啊, linux 啊, mybase 啊等等。好啦,第三步,条件筛选,因为我虽然列出来了很多的自动装配类,但是我不会去所有的都用,那么我只可能会去,呃,就是配置了 start 类的才会需要加载,所以那么这个呢,叫做条件筛选。那么有几个主要的 condition on class 类路径,下面有指定的类,我才会生效。比如说你引入了 smart start web, 那 么才会去加载 web 的 配置。然后第二个呢,就是 condition on missing bin, 就是 容器里面没有对应的 bin, 我 才会去 功效,比如说你自己写了一个 readymote, 那 默认就是不会加载了啊。然后第四步呢,就是注册 bing 的 i o c 容器,最后啊,把符合条件的配置类里面定义的 b 全部的注册到我们 spring 的 i o c 容器,那么整个自动装配呢,就完成了,能够去更好地导入我们的一些第三方的一些包。

spring boot 你 天天在用吧?那你有没有停下来想过一个问题, spring boot 在 spring 的 基础上到底封装了什么?我见过很多人呢,天天背诵什么自动装配的原理,学习各种 starter 的 使用技巧,却真没见过有人来关注过这个 spring boot 的 本质问题。 甚至在很多程序员眼里, spring boot 和 spring 完全就是一团浆糊,根本就分不清。这也导致了只要遇到版本兼容的问题,绝大多数程序员呢,完全是一脸懵, 叫什么?这叫战术上的勤奋,战略上的懒惰。你执着于这些细枝末节,却从来没有站在架构层面去思考过, spring boot 到底是要解决 spring 的 什么难点呢?它在宏观上到底做了哪些封装呢? 如果你连这个架构思维都没搞懂,那你背再多的八国文,也只是个熟练的 api 教员工。这一次,我带你站在架构师的角度,好好梳理一下 spring boot 的 设计思想,跟着我的思路走, spring boot 才真算是入门了。关于 spring boot, 太经典了,想说的太多了,这个视频可能有点长,但真的希望你能看到最后,记得点赞、关注、收藏,给自己留个底, 我是罗兰,关注我爱奇艺,路上一起进步!想要看懂 spring boot, 我 们必须找到一条主线, spring 已经很强大了,那 spring boot 要做些什么呢?仅仅只是把启动过程封装成一行 spring application 的 round 方法吗? 其实围绕 spring 容器启动前、启动中、启动后,各个不同的阶段都有无数需要优化的问题,正是这些问题,才让 spring boot 无比的经典。比如在容器启动前,各种乱七八糟的配置怎么去统一管理呢?容器启动过程中,一大堆的初设代码要执行,你怎么知道它运行到哪个阶段了呢? 容器启动后,怎么让开发者的感受更好?比如如果报错了,怎么让程序员快速看懂问题在哪?当然具体问题有很多, spring boot 的 所有核心封装就是围绕这三个阶段在展开的。接下来我们一个一个来看。 首先是容器启动前,我们都知道 spring 跑起来需要大量的配置清洗,以前写原生的 spring 呢,我们要配一大堆的插料,那 spring boot 是 怎么解决这个问题的呢?它没有去死磕怎么解析插料,而是做了一层极其漂亮的架构抽象, 它把所有的配置信息封装成了一个统一的 environment 对 象,而 spring boot 的 框架会负责将多个加载出来的 environment 对 象最终合并起来, say 给 spring 去加载各种乱七八糟的主键,你说这有啥用?其实这就是架构设计的魅力。 有了这层 environment 的 封装, spring boot 就 可以理直气壮说,我不管你以前配置写在哪儿,现在统统给我转移到我指定的 application 呀庙这种默认文件里来。当然,这还没完,你应该知道, spring boot 本身就指定了多个不同的配置文件,加载的目录与文件。但其实不管配置文件怎么花里胡哨,最终都只是需要加载出 environment 的 对象而已。 那我是不是可以从自定义的任意文件里面加载配置呢?哎,只要你想到了,要实现非常的简单,如果你这样尝试过,那可不可以把格局再打开一点?我可不可以通过网络从远程服务器上拉取配置,然后塞进这个 environment 里面。 有人抓住了这样的思想,于是 nike、 阿波罗这种分布式配置中心就诞生了,它们可以无缝接入 spring boot 乃至背后的 spring 体系,就是抓住了这个架构的扩展点。你看,搞懂了这种架构思想,那些高大上的中间件是不是瞬间就没有那么神秘了?甚至你也可以尝试动手去做做自己的配置中心,这可比背诵构建 stat 的 十种技巧有意思多了吧。 接下来到了容器启动中,这个阶段有什么痛点呢?这里有两个我觉得最为奇妙的设计,一个是自动装配,还有一个就是事件监控。先说自动装配哦,你一定背过相关的面试题,但是你有没有想过 spring boot 在 这其中做了什么呢?它解决了 spring 的 什么痛点呢? spring 框架其实早就支持用 add、 configuration 等一系列的注解来代替插秒进行注入了。 spring boot 是 怎么在架构上破局的呢?它引入了以 spring factories 为基础的配置文件机制,新版本更形成了 import 文件。但是底层思想其实是相通的,通过这一层配置文件,把分散在各个驾包里的零散配置内,全部集中到一个固定的配置文件里面。启动的时候,我一把说哈,全给你加了进来。 但这还不够,一大堆的主键相互之间还有各种依赖,不就乱套了吗?于是 spring boot 在 此基础上记出了真正的叉叉叉一系列的条件装配机制。 通过条件装配机制,你可以自动管理相关的组建依赖。你引入了 radis 的 组建依赖,好,那我就自动帮你把 radis template 装配好。 但这个机制其实还有个更强大的功能在于,你可以在没有 radis 依赖的基础上,就可以去检查项目中有没有 radis 相关的核心类,而不像写代码一样,没有 radis 的 依赖,你就没法 import 对 应的类,更别说后面的检查了。 这才叫约定大于配置。就是通过框架,把行业里的最佳实践当做约定提前写好,从而把你从繁琐的机械的组建、拼装工作中彻底解放出来。你要是学会了这种集中管理加条件触发的架构思想,以后去设计公司内部的基础脚手架时,能少走无数的弯路。 接下来是事件监控了,打开你的 spring boot 项目,在项目里面加入这样的一个类,然后启动你的 spring boot 应用,你就能看到很多这样的日制了。 这些日制是什么意思呢?其实就是 spring boot 的 框架在应用启动的过程中,不断地往外发布各种广播事件,告诉你应用启动的哪一步了,而你只要做一个监听器,就能够接收到这些广播信息。 关于这个案例,我可以告诉你,是接收到了 spring boot 应用中 spring 容器加载完成后的少数事件,而在 spring 容器加载前的一些事件,这个监听器它是接受不到的。这其实就是因为 add configuration 是 spring 房价中的助减,也就只有在 spring 容器加载完成后才能够生效。至于如何监听 spring 容器启动之前的事件,你能想到什么办法吗? 不妨在评论区说说,看看你这么多年的 spring boot 开发经验是不是花架子。接下来 spring 容器启动完了,并都加载了,这时候 spring boot 又做了什么封装呢?这里简单介绍 spring boot 提供的两个封装思路,一个是对异常信息进行封装,二呢是提供应用措施花接口。 以前多家把应用一旦容器失败了控制了,就会直接给你甩出几百行红色的异常站,找个错能把眼睛看瞎。所以 spring boot 封装了一套异常分析框架, 端口占用了数据库连不上了,它拦截到底层异常,直接用大白话告诉你哪错了,下一步该怎么解决。如果你的应用中定制了很多特殊的业务,那为了让运维有更好的体验,最好对每种边界情况定制一个异常类,再定制一个对应的 data analyzer, 让运维同学能一眼看懂问题出在哪里。另一个就是大家熟悉的 command line runner 和 application runner 这两个接口了, spring boot 会在整个应用启动完成后,主动调用容器当中的接口实现类,完成一些初步的工作。 springboard 的 框架本身其实并没有提供对应的实现类,也就是说框架本身其实并不需要只止这两个接口,那为什么还要这么做呢?其实这就是架构师们在系统准备就绪的那一刻,把系统的控制权优雅地交还给了开发者。 你需要加载缓存字典,你需要跑过粗糙的脚本,没问题。实现这两个接口,容器刷新完立刻回掉你既满足了你的业务需求,又不会破坏 spring 自身的生命周期,这就是架构设计的边界感。 为什么要搞这些细致默契的设计?其实就是一种优秀的架构设计思想,优秀的架构设计必须包含开发者体验,框架不仅要能跑,还要好用,这是架构师的同理心, 而这其实也是一个好的程序员成长的必经之路。什么样的代码才叫做好代码?并不是花里胡哨,别人看不懂的代码才是好的 spring boot, 这就是在给你一个最好的榜样。 当然, spring boot 这么经典的框架,细枝末节的精妙设计,那讲三天三夜也讲不完,而且你也不可能听得完,学得完。但是就看到很多人把这么经典的框架给说成了死板的八股文,我其实是非常失望的, 这也是为什么我很少出这些基础 java 内容视频的原因。而且现在有了 java, 很多人感觉基础编程就不用学了,学个 ai 就 够了,甚至觉得找工作的逻辑就是,你敢给我多少的工资,我就能做多大的事情。只要有了 ai 技术,不用学,我也是神仙。 但今天我说句难听的实话,对于百分之九十九的普通人来说, ai 它就只是一个工具,是个傻子都能用的工具。作为一个真正见过大风大浪的程序员,这东西你学的溜啊,你学个 spring ai, 比起学个 spring boot, 那 简单不要太多了。 程序员的门槛从来就不只是敲几行代码而已,而是你解决问题的思路,是你面对复杂系统时的架构思维。就像我们今天分析的 spring boot, 它的价值不在于写了多少行代码,而在于它洞察到了配置反手的痛点,才用优雅的架构思想解决了它。 ai 是 什么? ai 只是一个把你这种思想放大的工具,如果你的脑子里面就没有对业务的理解,没有对架构的认知,没有解决问题的思路,那你用 ai 也只是比别人更快的生成一堆垃圾代码而已。 所以只要找准了方向, spring 这么经典的框架也能够催生出 spring boot 这样同样优秀的框架。只要你的思想在你的方向,对, ai 就 永远只是你的小弟,而你才是那个掌握全职的架构师。最后记得点赞关注我,来的路上一起进步!接下来有任何问题,评论区见!

前端使用的是微控件,后端使用的是 micro 控件。如果有账号我们可以进行一个注册, 我们先进入我们的这个用户端输入,输入它会提示你 我们的用户端,我们在用户端可以看到心血血管疾病的一些知识,然后我们可以进行一个对自身的一个数据进行一个录入,我们先录入出去 我们的数据展示,可以看到我们刚刚录的数据就在这里,然后我们这里还可以根据我们最近录的这个数据进行一个评估,然后这里可以看一下 这个走势,这个走势,然后这里还会对数据进行一个分析,可以看到这里,然后看到我们之前录的数据,然后这里呢我们还可以和咨询医生,我们点的咨询,然后我们这边好,然后这是我们个人的资料一个管理,然后再进行一个搜索,然后我们现在退出登录我们的医生官 这里他可以对刚刚用户嗯发过来的一些问题进行一个回复,这里我们直接回一句啊,回复成功,那我们还得对自己的信息进行一个编辑,编辑,然后我们可以停整或者暂停状态进行一个编辑, 然后这是刚刚刚刚用户传来的一些信息,那我们先退出进入我们的用户端,看一下刚刚医生发过来的信息,看我们的回复会看到,然后我们现在进入我们的这个管理端, 你能不能进入我们的管理,管理这里也是可以看到我们的前,然后我们先进入我们的管理后台这里我们可以看到我们的数量,数量这些数据,这些一些官方的数据去看一下,就分这些,然后最具状态的这些, 然后我们可以在这里在用户管理的模块对一些用户进行一个管理,然后这个管理这里对这些知识进行一个编辑的一些发布。这些到数据管理这里可以看到,可以看到用户录的数据进行管理。然后这个地方看到刚刚用户微信上的一些小一些小游戏也可以进行管理的。在下面这里你看刚传的东西,然后这些可以对医生进行一个管理。

simple d a o。 不 只是一个框架,它是一整套完整的企业级解决方案。本系列带你从代码生成器开始,把整套方案全部刨通。第一层,管理系统底座,一个带完整 r b a c 的 spring boot 工程, 内置用户管理、部门管理、角色管理、菜单管理、字典管理、系统参数操作、日制七个模块。用户角色菜单三级权限控制是核心,字典管理是生成器里字典下拉功能的后端支撑。 底座不是大而全的功能堆砌,而是刚好够用的开发起点,任何人生成一个新模块,放进去直接就能跑。第二层,代码生成器,一个内嵌 html 界面的 spring boot 工程浏览器,打开即用, 选择数据库勾选模板,点击生成整套前后端代码,直接打包下载。实体类条件类, d a o service controller、 vol excel 前端列表、页弹窗、表单全部自动生成,字段类型自动映设,审计字段自动填充,逻辑删除自动判断。 第三层,三套模板,常规表格覆盖最常见的分页列表、场景查询、新增编辑、删除、导入导出,全部可用竖形维护,基于一张物理表,一次查询 java 内存中完成竖形拼装。三层和十层复杂度完全一样。 open vein 微服务生成, client 接口、 business 封装、 action 传输对象和 web 版形成对有关系四层配合,开发者只需要关注业务逻辑 底座,提供运行环境和基础设施。生成器负责自动化拼装模板,决定生成代码的形态。更重要的是,这套生成器是为 simple d a o。 量身打造的,生成的代码直接基于 simple d a o 范式,单表继承空类,即用连表,只写 c 库, 没有黑盒,没有侵入代码生成出来就是你的随便改。本系列后续逐一展开,每一层从底座到封装到生成器,完整闭环。

我们来说一下 spring 框架整体架构,就是这块,可能会问到 spring 框架中包含了哪些包,以及你对于它整体架构的一个理解,那如果去看过原码的话,能看到在原码中它是分了不同的 model 的 好吧,每个 model 里面提供了不同的功能实现,那这块我们可以把整体的框架和整体的架构做一个简单的一个解释,好吧,还要了解它里面到底提供什么样一个核心功能。 ok, 来写一下吧。四种框架采用分层架构设计好吧,核心模块结构,且可以按照项目的需要 来自由组合好吧,重点的核心模块包含如下,第一个比较重要的叫核心容器层好吧,这是我们在日常工作中用的相对比较多的,基本上是必用的好吧,它属于什么?叫 spring? 叫根基 好吧,所有的功能都基于该层进行实现,好吧,那这里面包含什么包?有我们的 bins 这个包,它主要提供的能力是什么呢?提供了 l c 和 d i 的 最基础能力,并的创建。哇,管理核心的生命周期管理的实现。哇,这是第一个包。第二包是我们的 contest 好 吧,它表示呢是基于 call business 包的扩展好吧,提供基础的,提供 application 高级容器能力,支持国际化 事件,事件发布,资源加载, ok? 第三个是 sp 也要这个东西,它是一个表达式好吧, spring 表达式语言支持运行时好吧,查询 操作对象属性,方法调用表达式表达式计算好吧,这第一个是我们的 a o, p 与 s type 模块 好,它的根本是提供了面向切面编程的完整实现。 aop 呢? aop 模块定义了 aop 的 核心 api 好 吧,与动态代理实现。 s pad 呢模块 无缝无缝集成了 s patch 的 这个 g 框架,大家日常工作中对 s patch 的 g 应该是用的比较多的好吧,如果你没有接触过这块东西,可能你要把你从前基础的这样的一个使用重新进行一个回顾了,好吧,这是第二个模块。第三个就是我们说的叫数据 访问模块,这块包含东西也很简单好吧,封装数据库操作能力包含了,比如说像 j, d, b、 c 是 大家最开始学的操作数据库的一个方案, j, d, b、 c, 像各种 o, r、 m 框架, 比如说我们的丽思 hyper 这样的框架,以及我们的 o 叉 m, 它叫什么呢?叫对象叉,幺二映射好吧,以及 gms 这东西得到消息队列好吧。还有我们最后一个的 transition 声明是事务管理模块。挂上这个东西,第四个很重要的一个点是什么的外部模块,我们在用 spring vc 的 时候,基本上设置的就是外部模块相关的一些功能,好吧,提供了 web 开发相关的能力,包含了 spring mvc 对 吧? web socket 对 吧? web flux, web flux 这个解释一下叫显式编程好吧,显式这东西咱们有可能同学可能在日常工作中没有接触过,好吧,你知道有什么概念就完事了好吧,以及 web 客户端等模块是等模块,这是个外模块,包含东西好吧。还有第五个就是我们的 test 模块,这 test 模块其实也比较好理解,我刚刚在上面讲这个特性的时候也提到过这个东西了,那集成了 unit 和 test nj 这样的一个方式,好吧,说提供了提供 spring 环境下单元测试和集成测试的能力支持,支持默克对象事务回滚等测试 特性。好吧,所以你可以把 spring 的 整体架构理解为这么多模块。当然我不是按照这个包来分,是按它的具体的功能实现来做了一个总结和对应的一个梳理。所以大家面试的时候也可以按照这五个点来进行对应的一个表述。 nice 加满便是手册。二十四瓦字 java 学习路线,从 p 五到 p 八,架构师加满便是场景题。私信我或评论区留言。

基于 spring boot 的 热门文创内容推荐平台。

大家好,我是扎曼幺二三四小风老师,今天手把手教大家用 ai 编程 coser 二十分钟开发一个会议室预约管理系统, spring boot 四,后端没有三前端,大家记得点赞收藏,下次需要用到的时候可以找到视频。 ok, 我 们来手把手教大家用 ai 编程 coser 开发一个 spring boot 四加 vr 三前后端分离的会议室预约管理系统。我们看一下我们的需求啊,项目的名称的话,我们指定是 java 一 二三四会议室预约管理系统, 然后后端是 springboard 四指定一下啊,然后我们会新建一个 c 维目录啊,我们指定一下目录,然后前端用 v 三加 element plus 啊,在那个 client 目录啊,数据库买 c 个八,指定一下端口三三零八,当然你那边可能是三三零六啊, 然后深层建标 c 口语句啊,以及测试数据啊,我们测测测,这个要提一下的啊,然后用户名密码不需要加密啊,密码是一二三四五六啊,你不说的话,它可能经常是 md 五加密的啊。 然后我们也说一下要求啊,这个适合那个大学本科毕业设计要求啊,复杂度适中啊,但你也可以说专科更简单一点啊,然后生成的代码要加中文备注啊,包括内容方法啊,备注。呃,你不说的话,他可能会不加啊,会加一点点啊, 呃,系统后台混主主页面啊,带一带一点那个数据统计图表功能,这个是我们必须的啊,项目里需要上传的图片啊,带一带一点那个数据统计图如下啊, 哎,这个的话,这个项目的话是有图片的啊,然后界面要求美观大方,多一些好看的样式,不能太古板。首先的话,我们第一步啊,来新建 springboard 后端项目啊,我们来打开那个 ida 啊,呃,这边 ida 已经打开了,我们来新建一下啊,这边的话是 new, 然后是 project 啊,然后这边的话我们指定到指定目录啊,然后这边,呃那个六这边啊, 这个目录下面啊,我们 solo 目录,大家自己先新建一下啊,先建一个 solo 目录,然后我们这边的话就叫 server 啊,在这个六下面啊,然后你看它,呃,项目会创建啊, creator, 然后这边是 java, 然后是选 web, 然后这个 artifact 的 话,是啊,是就像名称啊, server 啊,这个的话我们就叫 come, 点 java 一 二三四啊,然后点 next, 然后这里面我选哪些呢? web 肯是肯定需要的啊。呃,前后端分离的话,那个 spanish curatie 啊,也加上啊, 然后这里面的话,我们选一个 mybites 框架,这么多,够了啊,然后其他的话到时候交给 ai 啊, ai 会帮我们创建啊,然后这是 windows, 这样的话我们就创建完了啊,创建完了,当然我们要设置一下这个 menu 镜像啊,这样的话下载下载依赖会更快一点啊。 呃,大大家这个应该有基础的啊,这个 mate 阿里云镜像,这个自己配一下啊,这边的话我有个 setting 啊,就给大家自己找一下啊, setting 这个这个点掉啊,然后我们点 apply, 这样的话它就会用镜像啊, 就速度会快一点, ok 啊,这样的话我们就。呃后端项目啊, springboard 四项目就建完了,然后我们来第二步啊,第二步是来新建那个,呃,叫 vr 三前端项目啊,用 vita 构建。 这里面的话,我们到了,到那个这个项目目录啊,项目根目录下面进入命令行 cmd 啊,然后直接把那个粘贴一下, npm create, 用最新的啊, at latest 啊, 然后这边我们创建名称啊,这叫 client 项目啊,然后我们选 v, 选 java script yes, 稍稍等一下,它正在安装。安装啊,这很快就安装完了,我们点一下啊, 你看这样的话就表示安装完了。呃,这第二步已经完成,然后我们来完成第三个步骤啊, ctrl ai 生成项目代码。怎么生成呢?我们这样子啊,把这个要求啊给复制一下,贴到 ctrl 里面啊, ctrl 里面我们选的话选 oppo 四点七,我们先项目设计用 oppo 四点七啊,最高级模型,然后这里面我们选 play 啊, 这样的话架构设计一下,先让它来先用最高级的模型来架构设计啊,设计一个系统,稍等一下啊, ok, oppo 四点七,要求我们确认几个关键问题啊,以便制定更精准的方案。我们看一下啊,系统的用户角色,系统用户角色与界面范围如何设计啊?这边的话进管理员后台一套 一套界面啊,管理员登录后台会议室,呃,用户预约审批啊,普通用户也在同一个后台,登录后只能看到自己的预约功能啊,这个结结构简单啊,这是最简单的,然后这个的话,前前后台双端啊,管理员后台, 呃,管管理会议室啊,用户审批统计啊,用户前台浏览会议室,在线预约个人中线啊,两端共用一个 vr 项目啊, 呃,通过路由区分啊,这这个的话,这个的话比较好啊,这第二个,第三个我们看一下啊,前前后台完全分离两个。呃两个 vr 项目啊, admi 和分别运行在不同结构清晰啊,但工作量最大啊。呃这个的话啊 我们这样子啊,我们还是。呃我看一下啊我们还是用第二种方啊我选了第二种方啊 还是用一个项目因为我就建建了一个项目啊当然建两个项目也可以。其实啊然后需要包含哪些功能?可可多选啊。呃核心必选啊。这个这个肯定是需要的啊这个多选这个需要的。然后会议室分类管理啊 呃这个也需要啊然后部门管理啊部门预约时间显示哪个部门啊?嗯这个也加一下啊系统公告啊这个要的啊操作日期要的啊意见反馈要的啊,会议签到啊。 呃生成那个签到码或者说是人工签到啊。呃这这个的话就我想想这个的话就不要吧。然后首首页数据统计图表啊这个是需要的啊。 ok 然后我们肯定的啊这根据你的需求啊都可以啊。 稍等一下啊。 ok, 这呃 open 四点七的话那个设计价格已经给我们生产完了,我们可以先大体看一下啊,看看看满足是否满足我们的需求。你看这里面技术站的话没问题啊整体价格我们也看一眼啊。 呃这个的话也没有问题啊也没有问题啊。然后呢这里面是数据库设计啊他设计的这么多表啊然后这个是后端实现啊,具体的每一个包下面某些类啊这是样板配置啊然后前端前端的话也没问题啊然后关键的这个交互流程啊。 呃也没问题啊,它是设计的瓦尔,然后交付目录啊,呃验证方式, ok 啊,然后我们接下来的话让那个,呃 composer 二啊 fast 给来构建一下啊,你看我们不,我们来直接点这儿直接点这儿 build 啊, ok, 大 概有那个八个啊,八个步骤啊,等待一下啊, ok 呃 compress 二 fast 很 快的话给我们把项目生成完了,然后的话我们来做一个测试啊,这是它的一个交付清单啊。首先的话第一步啊,我们打开这个 server 啊 server 项目的话我们找到那个 c 口啊,是不是我们不得把那个 c 口啊给执行一下? 呃它的那个数据库名称啊,是 d b m t 啊,来我们找一下,因为我这边数据库比较多啊,待会你怕找不到啊。 app 刷新一下啊, d b m t 哎,在这啊,哎,就这个啊, ok 啊,这这测试数据都有啊。嗯,然后我们再打开那个前端项目啊, open 前端项目在 s y s 六啊, client trust new。 ok 啊,然后我们来启动试一下啊, 我感觉它这边是有问题的啊。这边你看 这这边这个估计是多的啊。 config, 你 看这边也有啊,它这边多了一个,多了一个,待会再说啊。看看,先启动先启动一下,这可以删掉的啊,它它也有执行,有时候也会有执行问题啊, 看它启动啊,哎这只启动的话没问题啊,没问题的话我们把这个删掉啊,这个没用的嘛,没用的留着干嘛呢?我这边再来启动一下啊,哎这只至少启动没问题啊, 说明它一直在进步啊。然后我们那个这边前端也启动一下啊,启动命令是 n p r d v 啊, 哎,直接能启动啊,我看一下啊。呃这个的话一看就是那个用用户啊,这是用用户的用户端的那个界面啊, 我们可以搜索那个会议室名称,但这边图片没有啊,我们先大体的来看一下啊。呃,那个,然后那个管理员的话我看一下啊,管理员怎么登录呢?管理员,我试一下啊,等下试啊的面 匿名啊。呃需要管理员权限啊,那我去登,我先登录一下啊,他这边的话应该是。呃。这边的话我我先用那个登录啊,一二三四五六, 就先直接用管理员登录啊, ok 啊,这里面的话啊,管理员的话这个应该是那个这最新公告啊, 这边有进入后台啊,管理员的话他可以直接进入后台的啊。后台的话这边的话是缺少一些数据啊, 然后部门部门,部门管理啊,然后会议室分类,会议室维护,然后预约审批。 呃公告管理啊,然后反馈处理,操作日期,个人资料数据看吧。 ok, 这样子啊。嗯。这边的话怎么有时候会显示不出来? 这边这边估计有报错了啊,我们来修复一下啊。 f 十二它肯定有报错了啊, 我们先刷新一下啊,刷新一下没问题,然后点了某个之后啊就有问题了,应该就在这啊。 user store 为第一啊,我们先把这个问题给修复一下啊,因为它导致了整个页面, 整个页面访问不了, 所以我们现在到了第几个步骤了?第四个步骤啊,测试修复 bug 调整功能啊, 先修复一下这个大的问题啊,然后我们待会加点图片啊,然后还要还要加点数据啊,我们现在应该可以了啊我们来刷新一下啊。哎你看现在是不是就可以了。 哎当然这边的话呃还还是那个缺少一点数据啊这边的话还有那个没显示出来。 呃这样子啊,我们再加一点测试数据啊就是说数据看板啊我们可以跟他提要求啊管理员登录啊数据看板没有报表数据显示啊。 加一些测试测试加。呃生成一些测试 c 口数据啊。 因为我们这边你看数据都没有啊然后预约状态分布啊。这个图图也没有啊图也没有,待会要要要问一下 ai 的 啊哎可能这边是可能是有问题的啊他有问题我们直接找 ai 就 行了。 稍等一下啊。生成啊。 d b mata。 呃 c s c 的 啊, 他已经帮我执行完了啊但是我发现啊他这个呃数据的话啊 呃数据我看一下啊这个数据的话它已经帮我帮我前面这边肯定是个 bug 然后现在的话是呃修复数据啊修复数据的话在哪呢在那个。呃在这啊在这是有的啊我看一下啊他可能帮我合并了啊。哦或者或者是这样子啊 这样子。这里面的话我们单独复制一下当然那边也有合并的啊。哎我们来试一下啊。呃看然后我们来刷新一下看一下啊。 呃数据的话还是没有啊就是这边的话七近七日提交数据应该应该有啊我看一下啊它是不是日期不太对啊 嗯提交了之后它还没有啊 嗯我我是不是得重新执行一下我看一下啊 实在不行这边就重新执行一下他他有可能也会有问题啊。全删全删掉啊,重新执行一下。 呃,还是没有还是没有啊?近期日预约都是零啊?嗯,是个 bug 啊,估计是个。呃,数据应该没问题啊,然后的话我们让那个来修复一下啊,就是说,呃,管理员 后台管理数据看板那个近期日预约啊,趋势啊,不显示数据 以及会议室使用 top 五啊。没有数据啊,没有数据显示啊。修复一下, ok? 呃。修复完了之后我们发现啊,你看是不是数据出来了,所以说有时候他这边数据没问题的话,呃有可能是程序问题啊,所以反正就这两个问题。然后我们这样子啊,就是说他这边的话是不是还缺少图片啊?图片的话我们是不是可以加一下图片啊? 我随便搞了一些图片,然后用 ai 生成的图片啊,把它给上传上去了。然后我们来看一下啊,这边图片有了之后啊,我们来走一下这个审批流程啊,我们返回到前台,你看这边是不是图片就有了?你看是不是还可以,然后可以查看全部啊? ok 啊,就八个啊,然后这边的话还可以分类搜索啊。呃然后的话我们来预约一下啊,预约的话,嗯这边的话是可以搜索名称啊,我们比如说预约一个这个啊,当然我们这是管理员啊,管理员预约不太好。我们这边的话是,呃,这边也有注册啊, 我们先返回一下,我们这边是找一个用户啊,呃,比如说这边用户的话是,呃用户, 这个是管理员啊,我找一个张三,一二三四五六,张三的话不是管理员啊,所以的话他这边的话是没有那个他是没有后台管理的啊,我们来预约一下啊。 呃这里面的话啊过一次主题啊,呃调研室啊,开呃例会啊,调研室周例会啊。 ok 呃。然后开始时间,比如说我们这边是 那个五月五号到 这这边的话,哎就就这样就行了。两天啊,人数六个人啊,说明啊说明那个 说明啊测测试说明嘛啊有时想不起来。然后我们提交预约该实战有预约冲突啊。嗯因为我刚才搞了很多的那个啊,所以的话我这边把它给去掉啊, 就预约长一点啊就预约短一点啊,我就预约一天,我看看应该没有没有冲突啊。 ok 啊。呃这样的话你看刚才测试的话还是那个啊。呃就是预约时间啊,其实就是一天,你看 这是预约时间啊, 然后我们看一下啊,待审核。我们是用管理员啊,刚才有个张三的啊, 我们要进入后台管理啊后台管理的话我们是预约审批啊,在这儿这是张三用户啊,然后我们这边审批, 呃当然审批的话这边又又有个问题啊,就是说他这边啊没有把那个呃提交的一个审批具体信息啊给显示出来,像这个的话我们就可以让 ai 来完善一下啊。就是说在呃管理员端 管理员后台管理啊,后台管理叫预约审批啊,我们要描述清楚啊。预约审批 预约审批,然后呃点点审批,要加一下加一下那个 申请的具体信息啊要要显示啊申请的具体信息啊。呃修复一下,我们让它来修复一下啊。这这种问题我们要经常会会写啊, 就不玩了,我们来看一下效果啊,看看看满不满意啊。我们这边再点审批,你看这边的话是不是就详细多了啊?从哪边从哪天到哪天申请啊?然后,呃,操作啊,我们是否通过啊?我们就提交通过啊,如果如果不通过的话,你要写那个驳回的理由啊, 当然也可以不行啊,这样的话我们就通过了,这样的话我们再再退出一下,我们用那个张张三啊,再登录一下,看看他有没有审批通过,因为我这是我们最核心的业务,不能出问题啊。然后我的预约 你看是不是通过了。 ok 啊,这就是我们的一个项目啊,需要高清视频加快捷加原码,可以进入风格抖音主页,直接进入公开群公告里直接领取。

今天的话我给大家带来一个旅游信息管理系统,这个是一个包含前台和后台的完整旅游管理。首先我们可以看一下他系统的前台部分,这里的话可以看到他的旅游景点以及酒店,还有一些旅游线路资讯,这里的话我们可以点进去看他的详细信息, 也可以进行预约,这里的话我给大家预约来一下,就是我们这里选一个日期还有姓名就快速写啊。然后我们点击确定,这里的话我是登录了,接下来我们可以看一下他的管理员,也就是后台,我们可以看一下他的首页, 这里的话提供了各种的数据的干了,比如说景点数量以及酒店数量,这里的话我刚才是已经预约了一个景点,这里的话需要我同意一下,因为我现在是管理员角色,景点这里我确认一下,就是我刚刚预约的, 确定完成之后,他的首页刷新一下这里的话,他就显示出来以图标的形式。接下来我们可以看一下他的经典管理,这里的话我们可以管理前台的一些经典的数据,比如说可以给他暂停下架,或者对评论进行相关的查看。 下面看一下线路以及他的酒店管理,那些旅游咨询管理。今天预约还有酒店预约,那今天的话就给大家讲到这里。

毕业设计答辩前,我们最好把我们的系统与小组内其他同学做的系统页面做一个对比,看有没有重复的,如果有的话一定要改掉,否则是你们两个可能都会二变。最近就是一个粉丝,他答辩的时候 他俩一前一后,然后背景图一模一样,老师通过背景图发现他其他的项目的按钮什么的都几乎一样,所以老师就判定他俩的项目是重复,然后就让他们两个都去二变,都修改完之后再来答辩。 那其实为什么会导致这样的一个原因呢?就是因为大家找的项目都是从网上找的,所以就以这个系统为例,那大家用的背景图很多就都一样,就一个小细节,其实功能都没问题,但因为这个小细节就导致你的项目可能重复,然后直接导致二变, 所以还是建议大家在打遍前拍一下我主页商品橱窗这个十三块九毛九的打遍课程。那我这里边呢,给大家讲到了如何换背景图,是你不懂代码的情况下,也告诉你怎么去改的。同时还有其他同学,比如说你的项目目录日期, 还有你的项目标题,项目注册日期怎么修改,这些都给你讲到。而且系统功能相关的这些问题呢,比如说前后端交互,那有跟你说了好几种方式啊,你系统是哪一种,比如说你的是这个权限管理啊,你的创新点和难点有哪些等等, 都不一样。那每我讲了好几种方式,每一个问题都是一个视频给你讲,只要十三块九毛九,还送你六千八百多字的文档,还送你什么?还送你几十套这样的 ppt 模板,就你直接可以用的,就一个 ppt 也不值这个价,需要的赶紧去拍。

讯导处报到讯导处报到,三零二班周杰伦马上到讯导处来, 而把我转进他桌 的只是教室的阳光,那眼神 和答案,我刚好都不会酸。没关系, 不想乱,我只想要流一点汗, 不想说选择对手跟我打的 仗,不用怕,告诉他们谁是男子汉。 不想乱,我只想要流一点汗, 我先说,选择对手肯定要发个证,全体师生注意,今天我要表扬一位同学,他为校争光,我们要向他开 启 炫耀,我永远做不到,你永远赢不了。我永远做不到,你永远赢不了,永远都赢不了。走,下山寻找他要爬山,为什么 鸟飞翔穿过这条小巷,为什么这么 细巷,这种生活很香,为什么这种速度你得不到?我想我想 我想 不想流一点汗? 我想说,树枝在小空,要打 的太香。寻找男人发香, 转,侧向转转,南向,南向鸟飞翔穿过这条小巷,仔细向这座小屋南向 讯导处报道,讯导处报道,三零二班周杰伦马上到讯导处来, 票卷的答案我刚好都不会算,没关系, 有人向你挑战, 不用怕,告诉他们谁是男子汉。 不想乱,我只想要流一点汗, 不想说选择对手更要罚个仗。 之前呢,是我们项目功能的一个大概演示,他的所有的功能点呢,我们的技术也基本上给大家都进行了一个演示,基本上也都点了一遍,大家都可以看一看视频里面的功能是否符合自己的要求。 嗯,如果大家选择我们家制作以后呢,我们会给大家介绍一下。呃,我们家的主要服务还有售后, 如果还没有进行选择题的同学,可以看一下我们的选择题指导,比如说我们这里有每一个种类,有网站类的,还有 java 类的,呃,有哪些常见的题目可以供大家选择呢?呃,这是这些都是我们之前有做过的一些案例,可以找到我们相应的视频进行一个参考。 比如说我们像 java 类的,呃,有两种框架,主要是 spring boot 框架,还有 ssm 框架,然后还有 python 的, python 主要是以 djiggle 框架还有 flag 框架为主嘛,然后还有我们呃大数据的,一个 一个类型的这种题目,都可以在里面找到我们对应的演示视频,大家都可以看看效果。 如果有想做小程序和 app 的 话,也是提供了一些题目和案例供大家进行一个参考,可以在之前的案例基础上进行一个新增功能和修改的功能。 深度学习的呢,我们也是给出了一些比较常见的数据集,可以在这些题目里面呢,大家可以方便找到适用自己的数据集,然后有了这个数据集之后,就可以训练项目,还有去做一些项目了。 这些常见的数据集大家都可以进行一个参考。 我们总结了一些常见的售前疑问,比如说不同的学校选择哪种题目比较简单,我们这里也是大概了解了一下, 比如说做管理系统的话适合哪些学校,如果在管理系统老师觉得比较简单的话,可以做一些算法, 那在里面加入一些算法进去,会增加一些相应的难度,然后这样难度会进行一个提升,或者是更难一点,就可以选择我们目前比较主流的大数据和深度学习这些项目,这些项目比较适合大数据,还有人工智能专业的一个学生,或者是难度比较高的一些专业 或者学校都可以选择大数据和深度学习。如果老师觉得咱们这个普通的呃管理系统比较简单的话,可以选择深度学习这样这些题目, 这样大家可以划分一下自己学校适合哪些题目。然后还有一般我们都有哪些服务呢? 就是首先我们是有成品的一个项目,还有就是我们主页经常看到的一些成品项目,这些项目呢大家可以注意一下,不管你是在哪里做的毕业项目吧,都可以先去网上看一看他们做的这个效果跟网上现有的是否一样, 这也是多年来大家一直踩坑的一个点,经常就是会有一些不良的商家把那个成品项目当成定制来给大家去卖,这样价格其实也会差很多,一般成品也就几百块钱,很低的价格都可以买到,根本就不需要定制那么贵的价格。 呃,其次呢,定制我们也会提供一些根据你的需求制作的代码,还有每年我们都会设计新的样式,这样来确保呃重复率的这个问题。最后一种就是全包了,就是如果彻底自己一点时间都没有的话,就可以选择一些全包的项目, 这样全包下来可以节省自己的时间,然后也就不用自己那么费费心了。这三种项目呢,也是随着他的价位不同,然后去修改的东西也不同, 它包含的内容也是不一样的,就是比如从上往下需要自己做的会越来越少,选择成品项目呢,就是可能需要自己做的多一些,然后定制项目呢,需要自己做的可能会比成品的要少一些,但是也是需要自己去写写文档,改改论文这些, 还有这种全包的,基本上就不用自己去修改了,不用自己去做了。还有一些常见的售后疑问,嗯,在这里我要有一个声明,比如说不管选择哪种方案吧,都会有一定的售后, 还有一些常见的套路,这些大家都可以根据自己的情况去甄别一下,避免也是呃自己入坑,每年都会有很多同学入坑,这样的话就是得不偿失了。 在选择我们项目之后,我们也会提供一些软件的安装教程,当然这样你也不用去了解。嗯,我们可以给你远程安装好这些安装包的下载,可以按照这些链接去下载, 下载好之后安装和配置啊,这些大家可以进行一个了解,如果想学的话就可以去了解了解啊,如果不想学的话,我们也是直接帮大家远程给安装好的。 比如说就是像这个就是呃 java 项目的一些连接,然后这里面就是 python 项目的一个连接,还有安装包,还有小程序和 app 的。 在后面呢,就是我们对项目的呃总结和开发的一些文档,比如说常见的 java 项目, 在这里我们可以看到一些代码的结构和目录的讲解,我们都是进行总结好的,比如说前台的每个文件夹是做什么的,后台的每个文件夹是做什么的,后端这些,然后还有一个讲解以及一个讲解视频在都在这个链接里面给大家总结好了, 还有像 s s m 框架、 python 框架,这些都是有一个总结的。还有对于一些难度的教程视频,我们都进行了不同的连接进行整理,大家有时间都可以进去看一看。 还有后后面还有一些常见的修改,比如说选择成品项目的话,我们会送一些改图片的教程,改本地文件的教程,以及还有修改时间的教程,这也是都是我们这么多年来的总结,修改时间这个教程也是非常实用的。 在这个写作方面呢,我们也是推出了一些写作教程和降重的教程。 嗯,一些常见的降重方法,肯定是手动降重的话会比较稳妥一些,毕竟现在都已经引入了 a i、 j、 c 降重了,所以我们选都是选择手动降重,这样的话也比较稳妥。 在这里我们总结了很多的报错,比如说一些常见的报错问题啊,我们在这里我们都有一定的总结,后面我们也会陆续的更新,就是说,嗯,我们这些项目都会给大家一一的售后。好 在每年我们都有一个答辩指导,在这里面都可以看到一些常见的呃,答辩的一个指导的问题, 比如我们给大家总结一些大家常见的问题,然后开一些会,然后预测,预测老师问的问题,这些等等我们都会在这里给大家进行一个相应的分析。

大家好,今天给大家介绍一个智慧交通管理大数据,那这个里面主要这个交通指的是公交车啊,然后这个是看到的是一个我们系统的一个呃,注意大屏, 那这个系统也是使用前端是使用 view 啊,后端是使用这个 spring 布台做的这个数据大屏。这边呢主要是展示了一个呃公交车的一些信息啊, 然后这个第二个部分呢,就是我们系统的一个界面啊,这个网站界面啊,这个网站界面里也可以看到啊,这边是一个 啊系统的这个社区啊,喏,我们现在用的是一个普通用户的角色灯,那这个系统里面包含了这个普通用户,然后公交车司机、管理员三个角色啊,那现在是普通用户这边是可以去对一些跟公交啊 有关的这个信息啊,我们可以去做做一个啊,做一个分享,然后也一个评论啊,这边呢是一个线路查询的功能,去查询这个公交线路啊,我们这个数据极速啊,是一个 广州的一个公交线路啊,可以输入这个公交线路的这个数字的编号啊,可以查询的一个站点信息,还有他的一个方向行,因为我们知道这个公交车他是有方向的,上上行下行, 然后这个评论管理,主要是对用户这个输入的一个评论的进行一个管理啊,然后还有消息管理。那下面的话我们再来切换一下角色啊,我们使用这个司机角色,我们可以登录的时候选择这个司机角色啊,可以看到这个更多的这个功能,司机角色主要是可以进行一个排班的,一个 啊查看就是我们这个司机师傅登录之后啊,可以看到他自己的一个排班情况啊。 啊,刚看到他自己的排班情况,我们可以看查看排班信息啊,排班信息我们是使用一个日历图啊,日历图这样一个组建去查看的,一看到他当前的这个月份啊,我们输入这个月份就可以查看到这个排班 啊,然后在这边还可以申请调班啊,系统管理员通过之后呢,就是会兑换这个排班信息啊,这边是主要是一个日历图组建啊,上面是一个那个一个 日历框,然后其他的功能都类似啊,然后我们还可以上报紧急啊,上报紧急的这个情况,这边有个按钮可以上报紧急情况,就是紧急情况可以上报给个管理员了。好说,我们比如说我们这个车子在运行过程中啊,出问题了,那可以及时或者发生了什么事故啊,可以上报一个紧急情况进行处理, 那也可以就是说申请调班,申请调班的话,主要是我们可以选择一个日期啊,选选择一个日期 当然是个调班的话啊,我们换一个用户,因为这个用户他没有排过班啊,所以他刚才那个日期呢?不能选,就是申请调班肯定你要有一个排班,排班的数据,然后他这个日期里面是根据你的排班的一个数据来选的,所以刚才我们换一个用户来登录就可以了。好,我们申请申请一下调班 啊,他这边就有很多班次可以选好,我们可以说身体不舒服,我们想要换一个换一个班啊,申请调班, 然后呢?我通过管理员后台的这个后台的这个调换啊,他这个调班就可以调过来啊,然后我们再来 后面再看一下其他的,这个是系统轮播图,主页上这个轮播图,那现在这个是管理员后台登录的一个界面,那在这边的话我们可以看到他的一个数据统计,现在司机数啊、公交车数啊这些,然后这个是线路信息 啊,线路信息我们可以看到它里面可以有很详细的一个配置啊,比如站点数量,然后它所属的一个公交车公司啊,公交车公司呢?它是支线呢?还是主线还是 brg 夜线啊?这个都是可以进行一个选择选择的,就是这里是一个数据的一个管理功能 啊,这个信息的话都来源于我们的数据几啊?这排湾管理的话就是可以用户管理,主要是可以对这个用户的角色进行管理,比如说啊,他是这个管理员还是普通用户啊,然后这个排湾管理这边主要是对这个, 这个就是这个车啊,他也还有上上班,嗯,他这个线路他还有白班和夜班啊,还有这个上行下行一个日期,你都可以自己去选啊,选择日期,然后去排这个公交车司机,然后线路的话也是可以去选的,都是选择不是输入的, 然后这个调班啊,然后我们再回来,回来的话可以看一下这个调班申请啊, 啊,可以看到这边的一个调班申请,然后我们再回到,回到这边啊,新增了啊,刚才这个功能主要是展示一下,我们啊,新增了一个,然后在上面主页上就可以看到啊,他的已经发生变化了, 然后我们再回到这里啊,你可以看到有一个新的一个排班应该就产生了啊,应该四月份啊,这边就产生了一个新的 新的一个数据啊,我们这个排版申请调版申请的话,刚才也是,我们就是有一个啊代处理的,就是刚才申请的,然后我们可以选择 g 版司机。可以选啊,那也可以去选择同意或者驳回啊,然后我们可以选 g 版司机, g 版司机肯定是从除了他之外的另外几个师傅中选择啊,我们点击已处理的话,他这边 这个调版调版申请下面就会有这个记录了啊,那我们找这个,刚才还是刚才那个用户去登录一下看一下。 好,这个刷新一下,你可以看到这个调班申请这边就有一个已通过的一个记录了,然后下面资讯管理,主要是我们这,然后这个突发事件管理啊,已突发事件管理,就是刚才用户司机都有上报了一个突发事件嘛,然后在这边可以看到这个资讯管理,主要就是我们这个信息社区啊,就是跟公要有管理这个信息 啊,这边的话就是刚才我们上传的这个,然后我们可以点击一下操作一下啊,退出,退出的话就到这个后台更。

各位同学大家好,下面分享一套利用 spring bootview 我 s q i o 还未得制作的一套个人图库管理系统, 该系统支持使用邮箱图片验证码、邮箱验证码创建自己的账号。 登录系统之后,我们可以看见有首页上传图片,我的相册收藏加标签管理等功能。 第一步,我们先上传一张自己的图片,比如随便上传一张图片,点击开始上传, 上传成功之后会调用大模型来识别这张图片是属于什么分类以及标签,这可以看到它的标签是文字图片,屏幕截图, 在标签这我们可以看,它就会自动地创建这个标签,然后点击标签会跳转到对应的图库照片的页面。 照片支持收藏,还可以添加到相册 以及下载功能, 收藏也没问题。 相册支持播放幻灯片,比如我们再上传一张图片,试试 识别到标签是水中的鲸鱼 搜索鱼,看看能不能解锁到之前的那张照片,好的也是没问题。 为什么这标签它会展示的时候会比较慢,因为这在后台做了一步的处理,让上传的速度加快。 好,我们把之前的那张鲸鱼照片移入到相册里面,移到这个相册里面, 如果你是使用相机拍摄的话,这里的拍摄拍摄的信息也会出来,比如说相机是什么类型的等等。 相册它是支持幻灯片播放的,上一张下一张,然后全屏的播放,像 ppt 一 样。 相册还支持分享的功能,创建复制链接,我们开一个新的窗口粘贴,输入刚才的密码,十二万三千四百五十六 也是没问题的,同时也支持把这个相册下载成为 zip, ok, 我 们打开看一下 也是没问题的。 同时还支持比如说你要删除这张照片,因为防止你误删,所以它会又有一个回收站, 如果你在这删除照片的话,那这个照片就会彻底的被删掉。 支持更新自己的头像以及选选中主题色,同时支持修改密码。

呃,那个好,我们今天的话依旧还是用 ai 去做一个项目的一个前后台啊。然后这个的话是一个微微界面,然后我们这边就简单看了一下它的路由啊,没太大问题。 然后 ai 大 话生成的话,配置还是跟以前一样的话,我们改一下这个本地的一个代理,然后还有这些,嗯,这些文件的话是一个依赖的一个文件吧。 然后他这边是一个路由,然后这个是一个实图页面,然后这个是他生成的一个数据库脚本,然后它里面内置的一些数据,然后有些数据他其实不太准确,那我们需要手动去调整,你必须在 ai 生成的嘛,不要指望他百分百会正确。 然后记得往下看。然后这个的话是以我们后端的一个配置,就是连接数据库什么的,这个,呃,密码什么的就往这里面设置,然后这边的话是一个权限的一个值啊,但是没有改动,然后这个的话它是一个项目的一个启动类。 那我们项目启动完之后的话,哦,这边还有一个我这个测试类啊,我那是为了获取这个初设密码,因为他那个脚本的输入生成的,我们不清楚密码是多少,那我们把统一重置成一二三四五六啊。然后的话这个的话就是我们前后台嘛,那前后台都启动完之后,你可以看到一个这页面,这个是一个主页嘛,对吧? 这个主页主页的话这边有一个菜品一个轮播吗?那轮播的图片的话,他原先的话他是没有的,就是说 ai 蹭蹭一个图片的话,他是一种案例,图片没有,那我们需要自己去手动把那个图片给它更新上去,然后,然后就是你可以看到一个图片,一个轮播,然后这个餐厅上面的这个,嗯, 图片也是一样的,我们需要把自己更下去,我们点击详情,你看到我们这边有一些菜品,因为我菜品我就用了一样的图片,因为我比较懒,懒得去说把它更新,各种各样的图片去搜,所以我就更新成一样的图片,我们是做一个演示, 然后你如果你需要的话,我们这边还可以下单嘛,对吧?需要一个 model 去结算,选三幺三点,我们点击去结算,去结算的话就达到一个购物车嘛,对吧?那购物车的话,那购物车这边图片呢?没显示呢?那也是说明我们后台数据库的图片没有更新,因为我用的都是 ai 生成一个默认一个数据,我们要插入,比如说有些图片它是显示不出来的,那我们需要后期去把图片给它更新上去啊, 然后我们再点击去结算,好,我们就可以看到我们这个默认一个订单地址,对吧?然后选择订单地址,或者说我们需要添加新的地址,就会调到这个地址添加的一个页面,对吧?那调到地址添加的页面的话,我们可以设为默认,或者说把哪个地址设为默认,然后就说点击编辑 地址去编辑什么这些东西啊?地址来做做个编辑号码,不对,必须不对什么的啊?你做个编辑一下,这样可以做个编辑,不需要的话我们删除掉,是吧?然后我们需要添加新的地址,添加新的地址或者是默认,对吧?然后这个是地址一个添加,那我们刚刚没有支付完成,是不是?那我们这边就会有一个,你看 这个重新点那个购物车吗?那购物车里就有我们要结算的一个量,呃,一个页面了,对吧?然后我们可以选择支付宝支付,或者说选择银行卡支付吧。那支付宝支付的话,那我们有一个什么功能呢?我们可以选择做一个尾支付。什么叫尾支付呢?就说你点击 提交订单后,然后马上跳出个支付页面,然后直接更新状态会出完成。或者说你还一种方案,就是 你去对接支付宝的一个沙箱,就是它支付宝一个沙箱嘛,就是它可以模拟支付宝一个支付环境嘛?然后你把这个沙箱给它对接上,你点击支付完之后,你跳转到支付宝沙箱去,然后进行一个模拟的一个支付,然后就是实打实的在支付宝那个模拟的页面上进行一个金额的一个支付完之后啊,我们就跳跳转回我们这个页面, 然后再把这订单状态更新为已经支付,然后这的话是一个比较完美的一个模拟,一个正式支付的一个流程。如果你需要把这个项目做的比较完美的话,那你可以按照我这个思路进行一个完善。如果你只是想说做简单一点,那你点击支付,点击支付完你就直接更新状态嘛,到后台把这个数据状态给它更新 完成,那这样也行,那具体看你自己壁设上,你自己有什么要求,对自己要求什么样的,是吧?有人想做的更细一点,那有人想做的一些粗糙一点的话,都是根据要求来的吧?因为 ai 的 话只是给我们做了百分之七十的活来搭建一个框架和对接某些后台接口,那一些细节上问题还是需要自己去处理的啊。 好,我们这个功能我们跳过了,不再去那个,不再继续去看了啊?去购物车,那我们购物车我们不需要的话,订单的话我们就是可以做一个删除的啊?不需要的一个订单你看到没?给他删除就好啊,刚刚购物车的话有,呃,去购物嘛,在在在前期也是购物 就点两个直接送啊,然后不需要的话就给他删除嘛,对吧?删除就给他删除,删除购物车就空着嘛,对吧? 空的啊,是吧?然后这个是一个商家一个菜品,我们刚刚其实还有没有点的一个什么地址管理的?然后订单管理我的订单吗?就比如说你支付完那些订单 就在这里面啊,订单一个状态再接单或者说已完成都可以,然后你需要的话你可以选择去评价,或者说选择一个详情,是吧?去支付,那去支付这个功能也可以对接到支付宝上一个沙箱,或者说你直接点击去支付就完成支付也行。其实跟刚刚那个订单下单页面是一样的啊, 两个功能的话其实都是同一个口,去支付宝都同一个口,然后再来一个取消订单或者一个详情嘛,对吧? 然后这边每一种订单状态的话,你需要的话你就根据订单去切换嘛,直接给他写订单是吧?由于他现在这个数据, 是吧?那比如说我们这里还有一个,就是说我们平时用户你要登录这个页面嘛,对吧?那登录这个页面的话,那我们可以做一个尝试,就是说,呃, 正常,是吧?我随便输一个测试你的手机号码,对吧?啊?我们如果平时登录验证码的话,发送验证码,那我们做这个测试号码就肯定收不到验证码,为什么呢?因为我们这个口他没有去对接第三方的一个发送验证码短信验证码的一个平台。 如果你后期有需要,你想把这项目做的比较好的话,那你可以试着去对接阿里云的一个发码平台,就是说他可以实实际的把这个验证码发到你的手机上, 这样你可以确实的用验证码去做一个登录,就是你手机可以真的收到验证码做一个登录,然后或者说你还可以用一个方式,就说你点着发送验证码之后,你在你这个后台生成一个验证码,就是在我们这个 id 页面,比如说这个控制台这边跑控台,我们就生成一个验证码,然后我们把验证码填过来做一个模拟,就是不做到那么真实,直接发到手机上,我们做个模拟也行 啊,拿这个密码登录的话,我们就直接输入密码就好了。然后这边还有一个注册功能,就说也是一样用手机号注册或用什么注册,对吧?然后你账号之后,我们就直接点点击登录,那他其实注册的话,他就会去叫验一些比较基础的值,比如说你号码不正确啊,他都会叫验啊,或者你昵称重复了,他也会做一个叫验啊, 然后这个其他登录方式的话,我们其实不用去完善了。这两种登录方式其实对于说普通使用场景器已经够了啊,那就随便输密码,如果输错的话呢? 啊?密码错误登不上的,然后输入正确密码,你可以登录上啊。啊,这个头像的话其实也是一样的,我们个人中心改头像的话,更换头像的话,嗯, ai 还没把这功能开发完,那需要的话你就自己去完善一下 更换头像一个功能啊,这个头像的话是我直接在数据库里改的,那你后期如果需要把这个功能往上的话,你点击更换头像的话,你可以在前台更换,也是可以的啊,这功能其实不难做,有需求的小伙伴,你们自己去把这个功能给我上完就好了啊。自己这个编辑一个信息啊。编辑, 我说设置一个邮箱,我们也不用设置啊,我们设置邮箱这个啊,设置邮箱编辑性别编辑吧。那我们看输入后台的话,一个数据的话,一个是电动的, 然后第一个帐账户数据呢?邮箱什么就更新了,那这就是数据的一个编辑,然后修改密码的话,也可以修改啊,然后这下面两个绑定微信、 qq 的 话,功能其实没太大必要。我们可以不用 啊,地址管理或者订单管理什么这些东西点击就跳转到相对应界面吧,对吧?或者我们这边还有一个输入登录吧,是吧?输入到这个界面,然后这个的话只是一个用户的一个界面,那我们 其他做一个系统,那我们是不是有三个用户,比如说管理员,还有一个商家,对吧?我们现在看这个是仪表盘,这仪表盘就是商家管理这个页面,对吧?那商家管理页面的话,比如说你是准备叫什么快乐餐厅或者叫什么的,是吧? 那这边会有一个店铺评分,买卖总数,然后商品走势的一个趋势图的话,他 ai 肯定还没给你完善。需要的话你后期给他加入一个微微的一个图标,就可以显示出一些折现折现图,或者说饼图或者一些柱状图来显示你一个订单的一个走向, 然后这边的话是你一个订单的一个相对于你的一个信息,对吧?点击订单一个详情,你可以看到这个订单的一个信息,对吧?有总价 花了多少,比如说下单配送时间很完没完成,收获人是谁?然后他点了什么菜品,单价多少,我们就可以在这上面看得到,是吧?然后这边菜品管理就是我这个商家,我平时要上新一些菜品,我们就添加菜品,然后把图片上传上去,然后 啊他这个上传功能的话,我猜测的话, ai 应该也是没帮我们做完的,点开看一下,对吧?还没有做完,没有做完的话,那我们后期自己去做一个对接,把它功能给它完善,这样它的功能就更加完美了,对吧?然后这边还有一些编辑啊,下架什么这些功能啊, 他如果 ai 没没做完的话,我们就把它完善,因为 ai 已经帮我把界面写的很漂亮了,对吧?那这个界面的话,其实实打实的说,我说的也看得过去,虽然说不是说特别精美,但是我觉得还算看得过去啊, 然后这边有一些商家一些状态嘛,到时候功能如果没有的话,你就自己来去对接他就好。这一个分类啊,搜索菜名什么都来到分类管理,那分类管理的话,这边就有一些,我们平时订单上一个分类嘛,对吧?这边一个分类就是说 我们这边的一个分类吧,对吧?我们可以在这边做一个添加, 如果你这个状态的话,我们不需要把这个分类起用嘛?起用或者不起用,然后把这个分类比如说排序权重给它调高调低,就是说排在前面或者并排后面,或者说我们给它分类删除,不需要我们的分类删除,对吧? 还有订单管理,这是我们一些定订单完成的配送中的啊,已经接单的各种订单状态在这上面,然后我们或者说根据我们时间去搜索我们订单号,查询订单号,然后比如说再接单,然后再出接单吗?就是别人下单了,我接单了,接单就开始去做,然后还有出单 各种状态的一个更新在上面,或者订单一个状况,我们可以再查看吧,跟刚刚一样,订单一个查看,跟在仪表房这边查看是一样的。然后一个店铺设置,比如说我上传我们店铺的一个头像,这个店铺一个头像,因为我现在是显示在数据库里的,所以这边的话显示头像的话是没有显示的,因为我们头像分两种,一个是在前台显示的,还有一个是 或者一个店铺一个头像。哎呀,很显然他这功能肯定还没有完善的吗?对吧?你走了,哎呀,还没完善,那其他功能就营业执照什么设置之类的,我们店铺状态是起用还是干嘛的,我们都可以做一个。这边做个设置嘛,后台页面就是还有一个活动管理,比如说我们店铺有什么活动吗?是吧? 把这个活动起用或者禁用啊?不需要的活动给他删了,是吧?就是这个活动管理,然后我们添加一个新活动,对吧?需要的活动内容添加进去确定就好了啊?然后这个是商家的,那我们还有一个管理员呢,对吧?那管理员那个页面的话就可以看到更多更多的一个内容,比如说一些商家 需要审核吗?有订单一些纠纷吗?对吧?我觉得这边各种各样的用户管理吗?比如我们系统多少个用户用户被禁用了?起用禁用,是吧?查看这个用户的信息之类的,是吧? 起用禁用,对吧?然后接着往下这还有商家管理,比如说这个商家的话是禁用这个商家,对吧?这个商家比如说违规了,我们把它禁用啊?禁用 好比说是商家想入驻,那么需要我们审核吗?对吧?从审核通过之后,他就可以在就可以在这边在这个页面上看到这个我们想参加了,对吧?只有审核通过我们才可以拉入驻吗?其实逻辑上就这个意思。然后 订单管理的话就这样的啊,比如说他他我们可以看到所有商家的一个订单吗?订单是怎么样怎么样怎么样的, 那怎么样怎么样,觉得什么样一个状态,然后查看了之后就跟商家一样会跳出一个这个订单详情页吗?是吧?如果 ai 他 没把这功能做完,那我们只需要把它做的跟这个功能一样就可以了, 就是把这一订单一个管理做成这样,跳转一个详情页就好了,是吧?啊? ai 他 现在是这边是没有把这功能做完的,那你只要反照的刚刚启动页面去做就好了。然后内容管理的话,就是说我们 ai 的 话 轮播图嘛,这个轮播图我们后续的话就通过这边添加轮播图,添加轮播图不要需要什么上传图片标题连接吧,上传上去之后,然后这样的话我们前面就可以显示这个轮播图,就这个轮播图我们需要上传几张轮播图往这边上传就可以了,就显示这个轮播效果。 那我们现在是没有,他现在只是做了个案例,在这边需要轮播图的话,这边就不显示了。 哎呀,他现在这功能他只是做了这边轮播,他没有把这个功能跟后台对接上过去,往上就可以了,不需要轮播怎么去删掉?还有公告或者帮帮助中心的一些 提示都是一样的。在这边做一个系统,一个定制款啊,你需要什么功能就往这边加,你的公告功能还没做完,那你给他添加网上玩就可以了,因为他已经把我们页面都做完,那我们需要做的是对接后台,有逻辑就好,对吧?啊?一个系统这个设置, 设置他这个系统,我们这系统叫什么名字?然后支付设置,比如说我们支付了一个商户话用的是啥配送,还有一个短信设置吗?比如说我们用的是阿里云短信服务商吗?就这个意思,像我刚刚之前有提到过吗?对吧?你要是真想短信要发码的话,那我们在后台做个配置, 对不对?然后如果没有的话,那些功能就用不上,对吧?然后支付设置的话,我们可以用支付宝一个沙箱一个做一个验证嘛,然后我们把相对应的配置 p 在 这上面,这样我们就不用去改后台数据,我们有个格式化的界面去改,我们的配置就会更加友好。 然后整个系统 ai 去生成,我们整个系统大概他一个页面布局长这样,那他 肯定是只完成了百分之七十,那有些细微的一些功能他没有做完,那肯定像我们自己去手工去接,你也不用指望 ai 百分百做完。 那做完这个功能基础上,你需要添加一些自己的小功能,比如定制化一些自己的一些特殊需求的一个功能,那你就在这个基础上去做一个添加,这样的话会给你节省很多你的开发时间,就不需要你从零开始搭建自己的页面。怎么去 布局页面啊?怎么去设计表啊?你都不需要考虑这些,因为如果你去考虑这些的话,那你前期搭建这个项目的,呃,这个进度会非常非常的慢,那 ai 已经把你这个项目搭建了百分之七十, 那你只需要后期你去补充一些自己需要的功能,完善一些 ai 上没有完善的一些功能就可以了。像有些接口他已经写好了,你都可以做一下案例去参考,然后去把这功能给它完善出来啊, 这样的话就会节省你非常多的时间啊,那你有更多的时间去专注你的功能业务上啊?去怎么去调试?对一些新手还会更加友好。你是新手的话,你花太多时间在搭建这个项目上的话,确实不太太那个能接受。 那它这个 ai, 它到时候它里面有案例,你新手的话这个案例就是说一照葫芦画瓢,我们就给他去做,多做几个接口的话,正常的话一般也都会学的。会啊,然后它整体的页面它其实就分为这三大一个模块啊。