【每天学点Spring】Spring以及Spring Boot框架知识图谱
参考
https://wwwyoutubecom/watchv=cehTm_oSrqA
https://wwwgeeksforgeeksorg/best-way-to-master-spring-boot-a-complete-roadmap/
https://wwwjavaguidesnet/2022/01/spring-boot-and-microservices-roadmaphtml
Spring框架以及Spring Boot框架当然是Java最火热的框架之一,罗列了一些知识点:
解释
看文档 是最最重要的,所以在RoadMap图中,把它放在第一位。
很多时候我们都会忽略这一点,但其实最准确的解释往往是来自于文档。开发人员花了大量时间来写文档,当然是希望对使用者有所帮助,并且Spring的文档写的也非常全面,所以很有必要好好读一读文档。
Spring 官网: https://springio/
Spring Framework文档: https://docsspringio/spring-framework/docs/current/reference/html/
从文档首页也能看到Spring框架的分类,所以才说文档很重要:
Spring Boot文档: https://docsspringio/spring-boot/docs/current/reference/html/
SpringBoot是一个基于Spring框架的快速开发的框架,它能够帮助我们快速构建JavaWeb应用程序。SpringBoot通过提供一系列的开箱即用的功能模块,使得我们能够更加简单快速地搭建出一个可运行的JavaWeb应用程序。
SpringBoot的优势
SpringBoot的优势主要体现在以下几个方面:
1快速开发:SpringBoot提供了很多的开箱即用的功能模块,使得我们能够快速构建出一个可运行的JavaWeb应用程序。
2简化配置:SpringBoot通过自动配置的方式,使得我们不需要手动配置很多的组件,从而简化了配置的过程。
3易于部署:SpringBoot提供了很多的打包方式,使得我们能够很方便地将应用程序部署到不同的环境中。
如何使用SpringBoot
使用SpringBoot进行JavaWeb应用程序的开发主要分为以下几个步骤:
1创建项目:使用SpringBoot可以通过官方提供的SpringInitializr来创建项目,也可以通过在IDE中创建Maven或Gradle项目来使用SpringBoot。
2添加依赖:在创建好的项目中,我们需要添加一些依赖,这些依赖将会提供一些开箱即用的功能模块。
3编写代码:在添加好依赖之后,我们就可以开始编写代码了。SpringBoot提供了很多的注解和工具类,使得我们能够更加简单地编写代码。
4运行应用程序:在编写好代码之后,我们可以使用SpringBoot提供的插件来打包应用程序,并且可以使用命令行或者IDE来启动应用程序。
示例
下面我们来通过一个简单的示例来演示如何使用SpringBoot进行JavaWeb应用程序的开发。
1创建项目
首先我们需要创建一个SpringBoot项目。我们可以在官方提供的SpringInitializr中创建一个项目,也可以在IDE中创建一个Maven或Gradle项目并且添加SpringBoot的依赖。
2添加依赖
在创建好的项目中,我们需要添加一些依赖。在这个示例中,我们需要添加SpringWeb和Thymeleaf的依赖。我们可以在pomxml中添加以下依赖:
```xml
orgspringframeworkboot
spring-boot-starter-web
orgspringframeworkboot
spring-boot-starter-thymeleaf
```
3编写代码
在添加好依赖之后,我们就可以开始编写代码了。在这个示例中,我们需要编写一个简单的控制器和一个Thymeleaf模板。我们可以在src/main/java/com/example/demo目录下创建一个名为DemoController的控制器,代码如下:
```java
@Controller
publicclassDemoController{
@GetMapping("/")
publicStringindex(Modelmodel){
modeladdAttribute("message","HelloWorld!");
return"index";
}
}
```
在这个控制器中,我们使用了@GetMapping注解来指定访问路径,使用了Model来传递数据,使用了Thymeleaf的模板引擎来渲染页面。
在src/main/resources/templates目录下创建一个名为indexhtml的Thymeleaf模板,代码如下:
```html
SpringBootDemo
```
在这个模板中,我们使用了Thymeleaf的语法来渲染页面,使用了${message}来显示控制器中传递过来的数据。
4运行应用程序
在编写好代码之后,我们可以使用SpringBoot提供的插件来打包应用程序,并且可以使用命令行或者IDE来启动应用程序。在这个示例中,我们可以使用Maven来打包应用程序,并且使用命令行来启动应用程序。我们可以执行以下命令来打包应用程序:
```
mvnpackage
```
执行完这个命令之后,会在target目录下生成一个名为demo-001-SNAPSHOTjar的可执行文件。我们可以使用以下命令来启动应用程序:
```
java-jartarget/demo-001-SNAPSHOTjar
```
启动应用程序之后,我们可以在浏览器中访问http://localhost:8080/,就能够看到我们编写的页面了。
第一种将资源文件放在源码里面:
那么配置文件信息如下:
<!-- 读取国际化资源文件 == 资源文件在包里面,路径写全包名-->
<bean id="messageSource"
class="orgspringframeworkcontextsupportResourceBundleMessageSource">
<property name="basenames">
<list>
<value>cn/ddx/i18n/messages</value>
</list>
</property>
</bean>
第二种配置文件在WEB-INF下面自己创建的目录下面:
那么配置文件信息如下:
<!-- 读取国际化资源文件 == 资源文件在WEB-INF下面 ,可以配置多个 -->
<bean id="messageSource"
class="orgspringframeworkcontextsupportReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>/WEB-INF/lang/messages</value>
</list>
</property>
</bean>
需要注意的是两者配置的class不同
配置文件路径中的“messages”为资源文件名称中_en_USproperties的前面部分,可以自定义。
简单demo
使用 maven 构建项目,官方现在稳定版本是154,第一个入门demo不是web项目,pom依赖如下:
实体 User 类:
配置类:
入口类 Application :
项目结构目录
启动程序,以 main 方法启动:
打印出正确的结果。
来分析一下流程,为何 Runnable 类, User , Map 会纳入spring容器。
首先我们分析的就是入口类 Application 的启动注解 @SpringBootApplication ,进入源码:
发现 @SpringBootApplication 是一个复合注解,包括 @ComponentScan ,和 @SpringBootConfiguration , @EnableAutoConfiguration 。
根据上面的理解,上面的入口类 Application ,我们可以使用:
使用 @ComponentScan 注解代替 @SpringBootApplication 注解,也可以正常运行程序。原因是 @SpringBootApplication 中包含 @ComponentScan ,并且 springboot 会将入口类看作是一个 @SpringBootConfiguration 标记的配置类,所以定义在入口类 Application 中的 Runnable 也可以纳入到容器管理。
看一个demo学会使用这些参数配置
在包下comzhihaomiaospringboot定义一个启动应用类(加上@SpringBootApplication注解)
在comzhihaomiaobeans包下定义一个实体类,并且想将其纳入到spring容器中,
启动启动类,打印结果如下:
说明Cat类并没有纳入到spring容器中,这个结果也如我们所想,因为@SpringBootApplication只会扫描@SpringBootApplication注解标记类包下及其子包的类(特定注解标记,比如说@Controller,@Service,@Component,@Configuration和@Bean注解等等)纳入到spring容器,很显然MyConfig不在@SpringBootApplication注解标记类相同包下及其子包的类,所以需要我们去配置一下扫包路径。
修改启动类,@SpringBootApplication(scanBasePackages = "comzhihaomiao"),指定扫描路径:
启动并打印:
当然使用@SpringBootApplication(scanBasePackageClasses = MyConfigclass),指定scanBasePackageClasses参数的value值是你需要扫描的类也可以,结果一样,不过如果多个配置类不在当前包及其子包下,则需要指定多个。
再看一个列子,
在上面的列子的相同包下(comzhihaomiaospringboot)配置了People,并将其纳入到spring容器中(@Component),我们知道@SpringBootApplication注解会扫描当前包及其子包,所以People类会纳入到spring容器中去,我们需要将其排除在spring容器中,如何操作?
可以使用@SpringBootApplication的另外二个参数(exclude或excludeName)
启动类,
启动并打印结果:
然后修改@SpringBootApplication配置,
很明显启动报错。使用@excludeName注解也可以。如下,
@SpringBootApplication(excludeName = {"comzhihaomiaospringbootPeople"})
参考文档:
Springboot154官方文档
本场 Chat 将使用 Spring Boot、Mybatis 搭建一个简易的 Java 服务,是一个不需要修改配置文件、不重启服务、动态切换数据源的项目,适合需要需要多数据源(经常变化的数据源,数据源 3 个以上等)的 Java 开发人员查阅。
该 Chat 偏向于实现动态加载数据源方式,能搭建一个能正常运行的动态多数据源的 Java 项目,同时会提供文章内所有的源码,以供读者快速搭建环境。故大部分篇幅用于描述环境搭建及应用,不会对各个技术内部进行深入。
以下是本 Chat 的核心内容:
默认数据源搭建;
创建 Map 保存数据源;
新数据源导入;
数据源持久化优化 。
网页链接
使用Java语言;数据库:Mysql;经典技术组合(MQTT、Spring Boot、Shiro、MyBatis、Druid、Ehcache、Thymeleaf、Bootstrap、Swagger)开发,支持多数据源,支持代码一键生成。
功能模块:
设备管理、开关管理、计划管理、传感器管理、传感器数据展示、报警规则管理、设备日志、用户管理、角色管理、部门管理、岗位管理、菜单管理、字典管理、参数管理、通知公告、操作日志、登录日志、在线用户、定时任务、代码生成、系统接口、服务监控、缓存监控、在线构建器、连接池监视等。
功能特点:
1、硬件使用 ESP8266,基于MQTT协议,自建物联网云平台。
2、支持云固件升级、设备远程重启。
3、支持音频播放、开关、普通灯、调色灯等各种用电设备控制。
4、单个模块可控制8路用电设备开关,可对模块信息、开关信息、计划任务、报警规则等维护管理。
5、云平台可对各类传感器管理,对传感器数据有多种展示方式。可设置阈值报警规则,符合报警规则的可执行自定义的动作。
6、模块具有一键配网功能,变更网络时无需重新烧写程序,方便快捷。
7、控制端可使用任意网络(2G/3G/4G/5G/WiFi/等)控制灯、热水器、电视、电机、窗帘、监控等各种用电设备,不受任何地区限制。
8、可云端存储模块各路开关状态,模块断电或重启后可自动同步云端模块各路开关状态,具有开关状态记录功能。
9、可记录设备所有操作记录,模块、用户上下线记录等,并具有多种类型的数据统计展示。
10、控制设备命令下达后有状态反馈,可确保设备控制命令执行成功,且延时低。
11、具有心跳检测功能,模块掉线或模块重启后模块可自动重连MQTT服务,具有模块上下线提醒功能(平台消息提醒、邮件提醒)。
12、具有定时功能,可指定某一时刻执行、周期执行、延时执行、自定义Cron表达式执行等操作。
13、可多模块接入云平台,可统一管理、控制模块各路设备开关。
14、云平台可对所有用户管理,每个用户可配置不同角色、不同权限,具有权限分配功能。
15、前端采用完全响应式布局,支持电脑、平板、手机等所有主流设备。
17、具有代码一键生成功能(包括控制器、模型、视图、菜单等),方便快速开发。
18、支持多数据源,简单配置即可实现切换。
19、支持菜单、按钮及数据权限分配,亦可自定义数据权限。
20、具有完善的XSS防范及脚本过滤,彻底杜绝XSS攻击。
21、Maven多项目依赖,模块及插件分项目,尽量松耦合,方便模块升级、增减模块。
22、支持服务监控、数据监控、缓存监控等功能。
1Spring Boot 是什么
我们刚开始学习 JavaWeb 的时候,使用 Servlet/JSP 做开发,一个接口搞一个 Servlet ,很头大,后来我们通过隐藏域或者反射等方式,可以减少 Servlet 的创建,但是依然不方便。
再后来,我们引入 Struts2/SpringMVC 这一类的框架,来简化我们的开发 ,和 Servlet/JSP 相比,引入框架之后,生产力确实提高了不少,但是用久了,又发现了新的问题,即配置繁琐易出错,要做一个新项目,先搭建环境,环境搭建来搭建去,就是那几行配置,不同的项目,可能就是包不同,其他大部分的配置都是一样的。
Java 总是被人诟病配置繁琐代码量巨大,这就是其中一个表现。那么怎么办?Spring Boot 应运而生,Spring Boot 是 Pivotal 团队在 2013 年开始研发的一个基于 Spring 的全新框架,试图将 Spring 中臃肿的配置进行简化,使 Java 开发更加轻量与快速,这个框架非常活跃,官方也非常重视。
Spring Boot 主要提供了如下功能:
为所有基于 Spring 的 Java 开发提供方便快捷的入门体验。
开箱即用,有自己自定义的配置就是用自己的,没有就使用官方提供的默认的。
提供了一系列通用的非功能性的功能,例如嵌入式服务器、安全管理、健康检测等。
绝对没有代码生成,也不需要XML配置。
Spring Boot 的出现让 Java 开发又回归简单,因为确确实实解决了开发中的痛点,因此这个技术得到了非常广泛的使用,大概从 2017 年年初开始,Spring Boot 基本上面试必问,现在流行的 Spring Cloud 微服务也是基于 Spring Boot,因此,所有的 Java 工程师都有必要掌握好 Spring Boot。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
从 Spring Boot 诞生的过程中,我们可以看到:
Spring Boot 并非另起炉灶,而是在现有的 Spring 框架的基础上整出来的,它把 Spring 中繁琐的配置进行了简化。
Spring Boot 降低了 Spring 家族的使用门槛,使新手更易上手 Spring 框架。
既然 Spring Boot 不是另起炉灶,那么 Spring Boot 学习要不要跳过 SSM 呢?听松哥来分析。
2要不要跳过 SSM
这是很多人问我的一个问题,我的建议是:不要。
Spring Boot 基于 Spring,简单且容易上手,很多人想当然的跳过 SSM 直接上 Spring Boot。但是当我们细究 Spring Boot 中的自动化配置、条件注解、Java 配置等东西时,实在找不出太多新鲜玩意,Java 配置是 Spring3 开始提供的,条件注解 也是 Spring 中的东西,很多很多,都是 Spring 中就有的,只不过这些东西在 Spring Boot 时代大放异彩。
也就是说,即使你跳过了 SSM 直接去学习 Spring Boot,实际上还是在学习 Spring 中的东西,那既然这样,我们还不如坐下来,老老实实把 Spring 过一遍。
各个领域的开发工程师其实都会面临类似的问题,学习了一些优秀的封装框架之后,还有没有必要去学习底层?当然有必要!因为底层的东西可以让你深刻的理解你目前用的这个东西,也能让你在出问题时快速解决掉问题。
其实无论你想搞什么技术,都要有牢固的基础知识,这些牢固的基础知识就像肥沃的土壤,可以孕育出各种不同技术方向的牛人,基础掌握好了,学什么框架都快。今天你跳过 SSM 直接学了 Spring Boot,假如有一天 Spring Boot 不行了,Pivotal 团队又基于 Spring 框架搞了一个新的框架出来,那你是不是又要去学一遍?但是如果你一开始就掌握了 Spring 的各种用法,无论基于它搞出来什么样的框架,你都能快速上手。更进一步,如果你研究透了 Spring 中的 AOP、Ioc/DI,你会发现很多框架大同小异,核心思想就是这些东西,那么你在学习 Spring 之外的框架,就会容易很多。
3都要学哪些
那么 Spring Boot 学习都要学哪些东西呢?我这里列举了一个进阶路线:
最基础的当然是 Spring/SpringMVC 相关的东西了。
搭配各种页面模版的使用,例如 Jsp/Thymeleaf/Freemarker/Groovy Templates 等。
和各种 SQL 数据库的整合,以及一些常见的数据持久化框架,例如 JdbcTemplate、MyBatis、Jpa 等。
和各种 NoSQL 数据库的整合,例如 Redis、MongoDB、Elasticsearch 等。
搭配安全管理相关的知识点,例如 Spring Security、Shiro 等。
缓存的使用,例如 JCache、Ehcache 等。
和消息中间件的搭配整合,如 ActiveMQ、RabbitMQ、Kafka 等。
数据校验/定时任务/邮件发送等。
各种监控的使用。
结合 WebSocket 的使用。
Spring Cloud 中相关组件。
上面这些只是我列出来的一些比较常见的技术点,每个技术点都还可以延伸出很多其他的东西,大家可以结合自己的情况,按照顺序一个一个来学,这里边还涉及到很多第三方的框架,例如 Redis、MongoDB、RabbitMQ 等,Spring Boot 的出现只是让这些组件在和 Spring 家族的产品整合时变得更加方便,但是并不会简化这些组件原本的用法,所以,该学 Redis、该学 MongoDB、该学 RabbitMQ 等等,还是一个不能少。以 Redis 为例,学会了 Redis,学会了 Spring 整合 Redis,再回过头来看 Spring Boot 整合 Redis,那简直太 easy 了。
当然,学习 Spring Boot 最终我们还是奔着快速开发和微服务去的,所以,像 Docker、Spring Cloud 等技术,也是需要去了解一下的。
4怎么学
Spring Boot 发展到今天,网上的资料和图书现在是越来越多了。在看资料学习的同时,大家也要留意以下几个点:
多看源码。不同于其他全新的框架源码你可能会看懵了,由于 Spring Boot 是基于 Spring 的,所以只要你 Spring 基础扎实,看 Spring Boot 源码可以说是毫无压力。如果看 Spring Boot 源码觉得有压力,那可能你 Spring 基础不牢靠,这个时候不妨放下 Spring Boot,去复习下 Spring。
每当学会 Spring Boot 中的一个知识点,不妨想想这个功能在 Spring 框架中要如何使用,如何配置,两边都搞懂了,互相印证,加深对一个知识点的理解。
多多关注 Spring Boot 的发展动态。不同于传统的框架可能一年更新一两次,Spring Boot 更新非常频繁,二次每次更新都会带来一些好玩的东西,可能会有新的 API 加入进来,也可能会有旧的 API 失效,变化大,因此多多关注,避免掉坑。
最后,我这里给大家列举几个我自己经常关注的几个资源。
41 官方文档
老实说,Spring Boot 的官方文档是我接触的所有官方文档中最条理清晰浅显易懂的,大家做开发,多多少少都接触过一些第三方的开放平台,很多平台的文档真是让人忍不住想吐槽,框架都做出来了,认认真真写个文档有那么难么?
不过 Spring Boot 的官方文档可以算是非常非常友好了。虽然是英文的,但是实际上对英文要求并不高,连读带猜,其实很容易明白它的含义,我一般对 Spring Boot 中某个知识点有疑问的时候,都是首选官方文档,当然,如果你嫌官方文档打开慢,也帮你下载好了最新版的 pdf。
大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫
「大佬可以绕过 ~」
本节给大家讲讲 「Java的SpringBoot框架」 , 之前我们学习的都是java的基础知识和底层提供的一些能力,我们日常工作都是在写接口。在我们在产品开发中,一般我们都会选择比较稳定的框架来帮我们加速开发,不会自己去造轮子,而在java众多框架中,spring框架表现的非常好,大部分公司都会首选它作为开发框架,而至今,大部分企业都是以 springboot 来构建项目了~
上期我们讲解了springboot中的 http请求处理 以及涉及到的几个注解。后台服务始终绕不开数据的开发,我们需要把用户产生的数据落地到数据库。本期,将带大家学习一下springboot中的 数据库处理 , 我们将学习目前市面上比较火的 Mybatis 框架, 它是一个 ORM 框架, 我将分为 三个小节 去讲解,现在用的比较多的数据库是 Mysql , 它是一个 开源 的 关系型 数据库, 这一节将带大家快速入门 Mysql 。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码
如果你是mac用户,推荐使用 homebrew 安装, 它是mac软件包管理工具,如果你还没安装, 可以到这个官网去安装 https://brewsh/index_zh-cn, 安装好后执行命令:
安装好后,它会列出启动命令,设置root密码命令,复制运行即可
如果你是windows用户, 可以直接去mysql官网下载安装, 安装好后运行即可
工欲善其事,必先利其器。目前市面上可视化工具很多,目前比较火的是 Navicat ,推荐使用,功能也丰富,界面也比较美观。平时开发中,推荐大家多使用工具,因为很多繁琐的事情,点点按钮就结束了,不用去敲黑乎乎的命令了。
安装好后,我们点击左上角的链接,链接到我们的数据库,链接成功后,右击链接名称,点击新建数据库。
多说一点, 在 生产环境 中,数据库操作,我们一般没有编辑操作,通常只有查询数据的操作, 一般用的都是云产品, 比如阿里云的 Rds ,因为维护数据库服务的成本太大了,安全性也不高,所以 生成环境 中的库一般都是用的云产品。如果你是管理员,对账号一定要做权限,和账号分配。
之前我们提到mysql是 关系型(RDBMS) 数据库, 我们需要理解几个关键术语:
如果你看的有点懵逼,没关系,这不影响我们成为 crud body , 本节只是带大家快速入门,不会涉及太多专业领域知识,不要慌~
终于进入正题了,下面我们学习一下mysql的 sql 编写。我们用 Navicat 新建一张表, 点击我们刚刚创建的库,点击表, 然后点击右边 绿色 加号,就可以新建了。 然后会跳出新建字段的界面,输入我们的字段就好, 字段 意思就是数据的一个属性, 这里我们以用户角色表为例,我就不一一带大家新建字段了,这里直接导sql,可以参考, 我也是用工具新建的,创建完的表想复制sql给别人,可以点击右边的 DDL 查看创建表的 sql
表我们插好了,怎么往里边查数据呢 有两种方式:
我们最常用的就是表的sql操作了,所以我们重点学习数据操作相关的 sql 语法
插入记录:
我们平常业务开发用的最多就是 查询 操作了,往往复杂的 sql 也都是在这里产生, sql 优化也是优化查询
sql 的语法语义化还是比较友好的,我们查询数据就是 select xxx ,在哪查就是 from , 查哪个就是 where ,很容易理解, 所以不用去背它,要去理解它,多写就熟悉了
这里给大家介绍常用的两种:
这种有弊端,就是 distinct 必须跟在字段
按 name 进行分组, GroupBy 后边可以跟多个字段,当是多个字段时,需要满足多条件
对于数据 去重 , 有时候当数据量很大的时候,我们用 sql 查询会非常吃力,我们可以在代码层面上做处理,因为程序计算比较快
本节到此就结束了,我们主要讲了 Mysql 数据库的使用,建议大家多自己练习练习,不要去背语句,要去理解它,适当的做些总结, 最新的代码已经同步到仓库了
有了 sql 基础之后,我们再学习 MyBatis 框架就相对简单了,下期带大家正式学习它~
【每天学点Spring】Spring以及Spring Boot框架知识图谱
本文2023-09-28 06:42:27发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/123934.html