上周Redis的学习终于告一段落,这周就要开始学习SpringBoot部分的内容了,这部分的内容我觉得很重要,毕竟SpringBoot是现在十分主流的开发框架,学就完事了。希望还有不懂的小伙伴也能够尽快掌握SpringBoot的使用。
SpringBoot介绍:SpringBoot是基于Spring进行开发,SpringBoot本身不提供Spring框架的核心特性与扩展功能,他只是用于快速,敏捷地开发一个Spring框架下的应用程序。是用来简化Spring框架中的配置的。
SpringBoot的核心思想是约定大于配置,意思是说我们可以不需要进行很复杂的配置,但前提是我们必须要按照SpringBoot官方约定的开发方式来开发,这会让我们减少很多以前需要自定义的配置。
简单了解一下SpringBoot之后我们来创建一个SpringBoot项目,来看看他到底如何在项目中来体现他的核心思想。
SpringBoot项目创建教程
我们先创建一个SpringBoot项目,由于我之前发布过文章,这里就不多赘述了,如果您用的是企业版IDEA则无需安装插件,但步骤都是一样的,实在搞不懂也可以在Spring官网进行项目创建。
对于初学者的小伙伴们来说,创建了一个SpringBoot项目后,最想知道的就是应该就是如何使用SpringBoot框架了。我先简单说一下SpringBoot项目框架都有哪些内容吧。
当我们打开项目后,发现项目结构是如下所示:
接下来我们一个一个的来解释一下各个文件的作用
文件夹/文件名 | 作用 |
.idea | 存放项目的配置信息,包括历史记录,版本控制信息等 |
.mvn | 存放maven-wrapper的相关文件用于mvnw |
src | 我们工作中主要使用的文件夹,存放我们开发的代码 |
.gitgnore | git的配置文件,可以配置提交git的时候哪些类型的文件不需要提交 |
项目名.iml | intellij idea的工程配置文件,里面是当前project的一些配置信息 |
HELP.md | 项目的帮助文档,相当于记事本 |
mvnw | 主要是用于当用户使用maven的命令时,发现本地的maven版本与.mvn文件夹下的maven-wrapper.properties文件中的maven版本不一致,就会下载maven-wrapper.properties文件中的maven版本,然后来执行maven命令,用于Linux环境 |
mvnw.cmd | 同上,用于Windows环境 |
pom.xml | maven依赖的配置 |
没有学习过Maven的同学到这里可能就需要先去学习一下Maven的使用了。
Maven在工作中的使用
这篇文章是我比较早学习的Maven笔记,有需要的小伙伴可以学习一下。
介绍完项目结构之后我们再来介绍一下SpringBoot项目的pom.xml文件中必须要用到的依赖。
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.6.4
com.springBoot
helloworld
0.0.1-SNAPSHOT
helloworld
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
依赖我们介绍完了,现在就要开始介绍要核心的内容src文件夹了,哈哈
src文件夹下面又有两个文件夹,其中main文件夹是用来进行日常应用程序开发的。test文件夹是用来让我们进行单元测试使用的。
我们可以发现main与test两个文件夹下的文件结构类似,只是main文件夹路径下还有一个resources文件夹,resources文件夹是我们用来编写项目配置的目录,无论主程序启动还是测试程序启动,都共用一套配置文件。
接下来我们再分析一下main文件夹。
main文件夹中的两个文件夹其中一个是用来存放java文件的java文件夹,另一个是用来存放配置文件的resources文件夹。
在java文件夹下还有一个com.springBoot.helloworld的包,这个包下有一个HelloworldApplication的java类。
这个java类就是SpringBoot框架中的启动类,在后续我们想要在本地启动SpringBoot项目并运行的话,我们就要执行这个类,执行方法如下:
1.ctrl+shift+F10方式启动
2.鼠标右键点击HelloworldApplication类,找到如下按钮,点击启动
了解大概的SpringBoot运行的方式后,我们就可以自己先调用一个接口玩一玩了。
在工作中我们项目的文件目录格式大概是这样的,Java类必须要与Application启动类(我这里是HeoolworldApplication)同级,否则不会被SpringBoot扫描到,这就展现了约定大于配置,我们不需要配置项目指定扫描哪些包,我们只需要按照约定办事就好了。
从上到下依次为控制器文件夹(Controller),持久层接口文件夹(mapper),实体类文件夹(pojo),业务类文件夹(service),我们只需要在控制器创建一个java文件,此时就可以使用SpringBoot在本地进行接口调用了。
package com.springBoot.helloworld.controller.test1;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Me
* @date 2022/3/19 15:14
*/
@RestController
public class springBootController {
@GetMapping("/hello")
public String test() {
return "hello world";
}
}
ctrl+shift+F10启动项目
像我这样启动项目之后,我们访问http://localhost:8080/hello,就会返回我们的字符串hello world。
此时我们第一个接口就调用成功了。
SpringBoot修改端口号及启动时图片
我们启动SpringBoot项目默认使用的端口是8080,接触过Tomcat的小伙伴们应该知道,8080端口是Tomcat的默认端口,那么我们应该如何修改这个端口号呢?其实很简单
我们打开main —> resources —> application.properties文件,添加server.port = 任意端口号后重新启动项目就可以了。
我们在创建自己的项目的时候启动会看到Spring的图标,如下图所示
这也是可以修改的,同样是约定大于配置,我们只需要在resource目录下添加一个banner.txt文件,启动时的SpringLogo就会被替换成我们txt文件中的内容。(只能在resource目录下直接添加文件才会生效)。
只要使用banner这个SpringBoot官方约定的文件名称,就会生效。效果图也放上了嘻嘻
最后给大家推荐一个我认为还不错的自动生成banner的网站吧,可以自定义转换文字,也可以使用其他人上传的内容。
banner在线生成
SpringBoot父项目依赖
上面我们说pom.xml文件的时候提到了每个未自定义父项目的SpringBoot项目都会默认定义一个父项目,那么这个父项目是干嘛的呢?
我们发现一般的项目都是有groupId、artifactId、version三个标签的,但是我们使用的web启动器却只有两个标签。
其实是因为我们使用的web依赖是继承自父类starter-parent依赖里面的,由starter-parent依赖来指定版本,这样做的好处就是不需要自己再自定义了,也不会因为不确定该选择什么版本而发愁了。
我们点进starter-parent依赖查看源码,我们发现starter-parent项目又依赖了另一个项目。
此时我们再来看看这个项目的源码,我们就会发现
这个文件中放置了很多我们可能会用到的依赖,SpringBoot都为我们选择好了版本,我们在使用的过程中只需要引入即可。
SpringBoot启动时加载的自动配置类的位置(导入对应依赖后,该文件中的配置才会生效)
有兴趣跟基础的小伙伴们我建议多看看这个包下的源码,很有帮助哦
上面我已经截图了,说明SpringBoot只识别三种类型的配置文件,分别为:yml,yaml,properties三种类型(后加载的会替代先加载的,也就是如果同时配置了yml文件与properties文件,则会使用properties类型的文件) 。
SpringBoot配置文件的位置生效的优先级排序为
1.项目文件夹 —> config文件夹 —> application
2.项目文件夹 —> application
3.项目文件夹 —> src文件夹 —> main文件夹 —> resource文件夹 —> config文件夹 —> application
4.项目文件夹 —> src文件夹 —> main文件夹 —> resource文件夹 —> application
那么这三种类型的配置文件我们应该如何选择呢?
答案是使用yaml或yml,properties文件的功能比较少,仅支持KV键值对的配置,并且多配置的情况下看起来没有yaml文件这么清新舒服,并且properties文件中写中文有时会出现乱码。在properties文件中如果您想查询Spring的配置,可能会查找到很多个,但在yaml中我们只会写一个,例如:
yaml文件格式看起来更加简洁舒服,但是在yaml文件与yml文件中我们应该如何选择呢?其实yaml文件与yml文件是一样的,但是说起来yaml更加正规一点,yml只是yaml文件格式的一种后缀文件类型,就例如我们的Excel,可能是.xls结尾也可能是.xlsx结尾,但是没有本质的区别。但是相对于yaml格式来说,别看yml只是节省了一个字符,受欢迎程度可是yaml文件没办法比的。
在工作中,我们公司的项目使用的配置文件就是以yml为后缀的,所以小伙伴们不用纠结这两个文件后缀啦,我已经帮你们纠结完了,哈哈。
最后在写一些yml文件的语法吧(仅供了解,一般使用的不多,因为毕竟是配置文件嘛)
# 表示使用哪个配置文件进行加载
# 如果不在同一个文件中写入,而是真正通过多个文件写入的话,我们可以创建application-xxx.yml文件格式
# 此时我们只要在active后面放入我们指定加载的文件的后缀xxx即可
spring:
profiles:
active: dev
# 设置为true则启动时加载的所有配置信息都会打印在控制台
debug: true
# 同一个文件中不可以有两个同级相同的key,但是---表示下面的内容是另一个文件里面的,所以不会有冲突
---
# 配置文件中也可以使用随机数
random: ${random.int}/${random.uuid}
server:
port: 8088
# SpringBoot2.4版本前的指定文件名的方法
spring:
profile: dev
# 对象类型1
#spring:
# datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver
# username: test
# password: 123456
# url: 127.0.0.1:3306
# 对象类型2
# datasource: {driver-class-name: com.mysql.cj.jdbc.Driver, username: test, password: 123456, url: 127.0.0.1:3306}
# 数组写法1
array:
- element1
- element2
- element3
# 同一个文件中不可以有两个同级相同的key,但是---表示下面的内容是另一个文件里面的,所以不会有冲突
---
# 数组写法2
array: [element1, element2, element3]
# SpringBoot2.4为了支持K8S做出的修改,也是官方最新推荐的方式
spring:
config:
activate:
on-profile: prod
server:
port: 8099
在SpringBoot的开发中我们难免要用Java代码去手动编写一些配置类,但是我们配置的内容希望能够在配置文件中体现出来,此时我们就需要Java代码与yml文件互通,那么如何互通呢?我这里针对于上述配置文件进行几个注解的解释。
// 此注解放在类上,等于说此类就等于prefix后面的key(此类需要注册Bean)
// 会根据名称对应将类的属性set进配置文件下spring.datasource下面的属性的值
// ConfigurationProperties注解支持松散绑定,也就是说,配置文件中的key-name可以与Java类中的keyName进行映射绑定
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class SpringDatasource{
private String driverClassName;
private String username;
private String password;
private String url;
}
// 我们可以自定义加载指定的配置文件
// 例如我们创建了一个test.yml文件,我们想加载里面的name值给我的Java对象
@Component
@PropertySource(value = "classpath:test.yml")
public class SpringDatasource{
@Value("${name}")
private String driver-class-name;
private String username;
private String password;
private String url;
}
// 或者使用value注解的方式放入值
// 由于Value绑定是直接一对一的属性绑定,所以Java类中的属性名可以随意规定
@Component
public class SpringDatasource{
@Value("${spring.datasource.driver-class-name}")
private String connectName;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.url}")
private String url;
}
SpringBoot静态资源的位置生效优先级排序为
1.项目文件夹 —> src文件夹 —> main文件夹 —> resource文件夹 —> resource文件夹 —> js
2.项目文件夹 —> src文件夹 —> main文件夹 —> resource文件夹 —> static文件夹 —> js
3.项目文件夹 —> src文件夹 —> main文件夹 —> resource文件夹 —> public文件夹 —> js
如果我们在配置文件中配置了如下内容,则使用自定义路径,上述路径失效,自定义的方式尽量不要使用,SpringBoot给我们的这几个文件夹就够用了。
spring:
mvc:
static-path-patten:
SpringBoot可以进行数据校验,这个我单独发布了一篇文章,因为可能需要后期继续更新,有想要了解的小伙伴可以戳进去看一看。
SpringBoot学习专题——数据校验
另外基本的部分还有一些Thymeleaf模板引擎的内容,但是现在一般都使用前后端分离架构,所以这部分我就没有仔细的进行学习,直接简单的了解了一下,有兴趣同学就需要自己研究啦,如果自己做练习在单机SpringBoot项目中使用还是不错的。
下一篇请戳↓
SpringBoot学习笔记(二)——集成持久层框架JDBC、Mybatis