写点什么

SpringBoot(二、基础知识)

作者:
  • 2022 年 8 月 21 日
    河南
  • 本文字数:5387 字

    阅读完需:约 18 分钟

SpringBoot(二、基础知识)

1、配置文件

SpringBoot 提供了多种属性配置方式

1)application.properties

优先级最高


server.port=80
复制代码

2)application.yml

第二优先级


优点:


  • 容易阅读

  • yaml 类型的配置文件比 xml 类型的配置文件更容易阅读,结构更加清晰

  • 容易与脚本语言交互

  • 以数据为核心,重数据轻格式

  • yaml 更注重数据,而 xml 更注重格式


语法规则


  • 大小写敏感

  • 属性层级关系使用多行描述,每行结尾使用冒号结束

  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用 Tab 键)

  • 空格的个数并不重要,只要保证同层级的左侧对齐即可。

  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

  • # 表示注释


==核心规则:数据前面要加空格与冒号隔开==


server:  port: 81
复制代码

3)application.yaml

server:  port: 82
复制代码

2、Jar 包

1)打包

在 pom.xml 加入插件


<plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId></plugin>
复制代码


我们只需要使用 Mavenpackage 指令打包就会在 target 目录下生成对应的 Jar 包。

2)启动

进入 jar 包所在位置,在 命令提示符 中输入如下命令


jar -jar springboot_01_quickstart-0.0.1-SNAPSHOT.jar
复制代码


执行上述命令就可以看到 SpringBoot 运行的日志信息。

3、parent

​ SpringBoot 关注到开发者在进行开发时,往往对依赖版本的选择具有固定的搭配格式,并且这些依赖版本的选择还不能乱搭配。比如 A 技术的 2.0 版与 B 技术的 3.5 版可以合作在一起,但是和 B 技术的 3.7 版合并使用时就有冲突。其实很多开发者都一直想做一件事情,就是将各种各样的技术配合使用的常见依赖版本进行收集整理,制作出了最合理的依赖版本配置方案,这样使用起来就方便多了。


​ SpringBoot 一看这种情况 so easy 啊,于是将所有的技术版本的常见使用方案都给开发者整理了出来,以后开发者使用时直接用它提供的版本方案,就不用担心冲突问题了,相当于 SpringBoot 做了无数个技术版本搭配的列表,这个技术搭配列表的名字叫做<font color="#ff0000"><b>parent</b></font>。


​ <font color="#ff0000"><b>parent</b></font>自身具有很多个版本,每个<font color="#ff0000"><b>parent</b></font>版本中包含有几百个其他技术的版本号,不同的 parent 间使用的各种技术的版本号有可能会发生变化。当开发者使用某些技术时,直接使用 SpringBoot 提供的<font color="#ff0000"><b>parent</b></font>就行了,由<font color="#ff0000"><b>parent</b></font>帮助开发者统一的进行各种技术的版本管理


​ 比如你现在要使用 Spring 配合 MyBatis 开发,没有 parent 之前怎么做呢?选个 Spring 的版本,再选个 MyBatis 的版本,再把这些技术使用时关联的其他技术的版本逐一确定下来。当你 Spring 的版本发生变化需要切换时,你的 MyBatis 版本有可能也要跟着切换,关联技术呢?可能都要切换,而且切换后还可能出现问题。现在这一切工作都可以交给 parent 来做了。你无需关注这些技术间的版本冲突问题,你只需要关注你用什么技术就行了,冲突问题由<font color="#ff0000"><b>parent</b></font>负责处理。


​ 有人可能会提出来,万一<font color="#ff0000"><b>parent</b></font>给我导入了一些我不想使用的依赖怎么办?记清楚,这一点很关键,<font color="#ff0000"><b>parent</b></font>仅仅帮我们进行版本管理,它不负责帮你导入坐标,说白了用什么还是你自己定,只不过版本不需要你管理了。整体上来说,<font color="#ff0000"><b>使用 parent 可以帮助开发者进行版本的统一管理</b></font>。


  • 项目中的 pom.xml 中继承了一个坐标


<parent>    <!--引入父工程SpringBoot(启动器Starter),它里面包含了许多SpringBoot的子工程-->    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.5.4</version></parent>
复制代码


  • 打开后可以查阅到其中又继承了一个坐标


<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-dependencies</artifactId>    <version>2.5.4</version></parent>
复制代码


  • 这个坐标中定义了两组信息,第一组是各式各样的依赖版本号属性,下面列出依赖版本属性的局部,可以看的出来,定义了若干个技术的依赖版本号


<properties>    <activemq.version>5.16.3</activemq.version>    <aspectj.version>1.9.7</aspectj.version>    <assertj.version>3.19.0</assertj.version>    <commons-codec.version>1.15</commons-codec.version>    <commons-dbcp2.version>2.8.0</commons-dbcp2.version>    <commons-lang3.version>3.12.0</commons-lang3.version>    <commons-pool.version>1.6</commons-pool.version>    <commons-pool2.version>2.9.0</commons-pool2.version>    <h2.version>1.4.200</h2.version>    <hibernate.version>5.4.32.Final</hibernate.version>    <hibernate-validator.version>6.2.0.Final</hibernate-validator.version>    <httpclient.version>4.5.13</httpclient.version>    <jackson-bom.version>2.12.4</jackson-bom.version>    <javax-jms.version>2.0.1</javax-jms.version>    <javax-json.version>1.1.4</javax-json.version>    <javax-websocket.version>1.1</javax-websocket.version>    <jetty-el.version>9.0.48</jetty-el.version>    <junit.version>4.13.2</junit.version></properties>
复制代码


​ 第二组是各式各样的的依赖坐标信息,可以看出依赖坐标定义中没有具体的依赖版本号,而是引用了第一组信息中定义的依赖版本属性值


<dependencyManagement>    <dependencies>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-core</artifactId>            <version>${hibernate.version}</version>        </dependency>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>${junit.version}</version>        </dependency>    </dependencies></dependencyManagement>
复制代码


总之


  • 开发 SpringBoot 程序要继承 spring-boot-starter-parent

  • spring-boot-starter-parent 中定义了若干个依赖管理

  • 继承 parent 模块可以避免多个依赖使用相同技术时出现依赖版本冲突

  • 继承 parent 的形式也可以采用引入依赖的形式实现效果

4、starter

​ SpringBoot 关注到开发者在实际开发时,对于依赖坐标的使用往往都有一些固定的组合方式,比如使用 spring-webmvc 就一定要使用 spring-web。每次都要固定搭配着写,非常繁琐,而且格式固定,没有任何技术含量。


​ SpringBoot 一看这种情况,看来需要给开发者带来一些帮助了。安排,把所有的技术使用的固定搭配格式都给开发出来,以后你用某个技术,就不用一次写一堆依赖了,还容易写错,我给你做一个东西,代表一堆东西,开发者使用的时候,直接用我做好的这个东西就好了,对于这样的固定技术搭配,SpringBoot 给它起了个名字叫做<font color="#ff0000"><b>starter</b></font>。


​ starter 定义了使用某种技术时对于依赖的固定搭配格式,也是一种最佳解决方案,<font color="#ff0000"><b>使用 starter 可以帮助开发者减少依赖配置</b></font>


​ 这个东西其实在入门案例里面已经使用过了,入门案例中的 web 功能就是使用这种方式添加依赖的。可以查阅 SpringBoot 的配置源码,看到这些定义


  • 项目中的 pom.xml 定义了使用 SpringMVC 技术,但是并没有写 SpringMVC 的坐标,而是添加了一个名字中包含 starter 的依赖


<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>
复制代码


  • 在 spring-boot-starter-web 中又定义了若干个具体依赖的坐标


<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-json</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-tomcat</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-web</artifactId>        <version>5.3.9</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-webmvc</artifactId>        <version>5.3.9</version>        <scope>compile</scope>    </dependency></dependencies>
复制代码

5、starter 与 parent 的区别

  • <font color="#ff0000"><b> starter</b></font>是一个坐标中定了若干个坐标,以前写多个的,现在写一个,<font color="#ff0000"><b>是用来减少依赖配置的书写量的</b></font>。

  • ​ <font color="#ff0000"><b>parent</b></font>是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由 SpringBoot 统一管理,这样就不存在版本冲突了,<font color="#ff0000"><b>是用来减少依赖冲突的</b></font>。

6、Restful 接口

1)Restful 接口请求风格

  RESTFUL 是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL 适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。


  对资源的操作包括获取、创建、修改和删除,这些操作正好对应 HTTP 协议提供的 GET、POST、PUT 和 DELETE 方法。换言而知,使用 RESTful 风格的接口但从接口上你可能只能定位其资源,但是无法知晓它具体进行了什么操作,需要具体了解其发生了什么操作动作要从其 HTTP 请求方法类型上进行判断。具体的 HTTP 方法和方法含义如下:


  • GET(SELECT):从服务器取出资源(一项或多项)。

  • POST(CREATE):在服务器新建一个资源。

  • PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。

  • PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。

  • DELETE(DELETE):从服务器删除资源。

2)传统风格与 RestFul 对比

  1. 传统方式操作资源


  • http://127.0.0.1/item/queryItem.action?id=1 (查询,GET)

  • http://127.0.0.1/item/saveItem.action (新增,POST)

  • http://127.0.0.1/item/updateItem.action (更新,POST)

  • http://127.0.0.1/item/deleteItem.action?id=1 (删除,GET 或 POST)


  1. RestFul 方式操作资源


  • http://127.0.0.1/item/1 (查询,GET)

  • http://127.0.0.1/item (新增,POST)

  • http://127.0.0.1/item (更新,PUT)

  • http://127.0.0.1/item/1 (删除,DELETE)

7、请求参数常用注解


翻我上篇 http://t.csdn.cn/tthWz


6、7 代码演示


@RestController     //@Controller + @ResponseBody@RequestMapping("Stu")                                      //抽出Stu@Slf4j              //lombok的日志注解public class StudentController {
@GetMapping("{stuId}/get") // 定义请求路径 public String getStu(@PathVariable("stuId") String stuId, @RequestParam("id") String Id, @RequestParam("name") String name ) { /** * @PathVariable("stuId") url路径的参数 * @RequestParam 用于获得url中的参数,如果与前端参数一致则,可以不写 */ log.info("stuId:{},id:{},name:{}", stuId, Id, name); log.warn("stuId="+stuId); log.warn("id="+ Id); log.warn("name="+name); return "查询Stu"; }
@PostMapping("create") // 定义请求路径 public String createStu(@RequestBody Map<String,Object>map, @RequestHeader("token") String token, @CookieValue("clientId") String clientId, HttpServletRequest request ) { /** * @RequestBody 用于获得前端发送的数据Json * @RequestHeader 用于获得请求头中的数据 * @CookieValue 用于获得cookie中的数据 */ log.warn("token="+token); log.warn("clientId="+clientId); log.warn("map="+map.toString()); String header = request.getHeader("token"); log.warn("header="+header); return "新增Stu"; }
@PutMapping("update") // 定义请求路径 public String updateStu() { return "修改Stu"; }
@DeleteMapping("delete") // 定义请求路径 public String deleteStu() { return "删除Stu"; }

}
复制代码


发布于: 19 小时前阅读数: 61
用户头像

关注

在校大三学生一枚 2022.08.02 加入

喜欢学习编程,擅长技术栈JAVA

评论

发布
暂无评论
SpringBoot(二、基础知识)_SpringBoot 2_斯_InfoQ写作社区