文章目录
- Lombok
- Lombok介绍
- Lombok常用注解
- Lombok应用实例
- 代码实现
- idea安装lombok插件
- Spring Initializr
- Spring Initializr介绍
- Spring Initializr使用演示
- 需求说明
- 方式1: IDEA创建
- 方式2: start.spring.io创建
- 注意事项和说明
- yaml语法
- yaml介绍
- 使用文档
- yaml基本语法
- 数据类型
- 字面量
- 对象
- 数组
- yaml应用实例
- 需求图解
- 代码实现
- 注意事项和使用细节
- WEB开发-静态资源访问
- 官方文档
- 基本介绍
- 快速入门
- 注意事项和细节
- Rest风格请求处理
- 基本介绍
- 应用实例
- 注意事项和细节
上文中, 我们学习的是分布式微服务: springboot底层机制实现
Lombok
Lombok介绍
●Lombok介绍
1.简化JavaBean
开发, 可以使用Lombok
的注解让代码更加简洁. mybatis中学习过
2.Java项目中, 很多没有技术含量又必须存在的代码, POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些代码既没有技术含量,又影响着代码的美观,Lombok应运而生。
●SpringBoot和IDEA官方支持
1.IDEA 2020已经内置了Lombok插件
2.SpringBoot 2.1.x之后的版本也在Starter中内置了Lombok依赖
Lombok常用注解
Lombok应用实例
代码实现
●需求说明
回到我们的 quickstart 项目, 使用Lombok简化Furn.java代码, 让代码简洁高效
1.在pom.xml
中引入lombok
引入lombok, 版本在spring-boot-dependencies-2.5.3.pom已经指定了, 把光标放在lombok, ctrl+b 可以看到. springboot依赖管理
2.修改Furn.java, 使用Lombok注解简化代码. 提示: 可以通过idea自带的反编译功能, 看Furn.class的源代码
@Component
@ToString //编译时, 生成toString方法, 默认情况下, 会生成一个无参构造器
@ConfigurationProperties(prefix = "furn01")
public class Furn {
private Integer id;
private String name;
private BigDecimal price;
}
3.@Data
注解
@Component
@ConfigurationProperties(prefix = "furn01")
/**
* 说明:
* 1. Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}.
* 2. @Data 注解等价使用了 如下注解
* @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode
* 3. @RequiredArgsConstructor, 单独地说一下
*/
@Data
public class Furn {
private Integer id;
private String name;
private BigDecimal price;
}
编译后
4.@RequiredArgsConstructor
详解
在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很乱
lombok
提供了一个注解:
@RequiredArgsConstructor(onConstructor = @_(@Autowired))
写在类上可以代替@Autowired注解,需要注意的是在注入时需要用final定义,或者使用@notnull注解
5.@NoArgsConstructor
详解
/**
* 说明: @NoArgsConstructor 在编译时, 会生成无参构造器, 前面我们说过, 默认情况下, 会生成一个无参构造器
* 说明: 当我们有其它构造器生成时, 如果你希望仍然有无参构造器, 就需要使用@NoArgsConstructor显示声明一下
* , 否则就会覆盖无参构造器, 从而造成代码错误
*/
//@NoArgsConstructor
/**
* @allArgsConstructor 在编译时, 会生成全参构造器, 造成覆盖掉无参构造器, 项目启动, 报错
* 解决方案一: 取消Furn作为Bean注入, 那么在需要自动装配Furn的位置, 通通注释掉
* 解决方案二: 显式声明一下无参构造器, 可以手写, 也可以用@NoArgsConstructor
*/
@AllArgsConstructor
public class Furn {
private Integer id;
private String name;
private BigDecimal price;
}
idea安装lombok插件
1.不装插件也可以使用基本的注解, 比如 @Data, @Getter 等.
2.但是不能使用其扩展功能, 比如 日志输出, 如意我们还是安装一下, 也比较简单.
3.演示使用Lombok
支持日志输出(建议使用slf4j), 修改src/main/java/com/zzw/HiController.java
@RequestMapping("/furn")
@ResponseBody
public Furn furn() {
//System.out.println("furn = " + furn);
//使用slfj日志输出
//普通方式
log.info("furn-" + furn);
//占位符方式输出
log.info("furn={}, myfurn={}", furn, furn);
return furn;
}
4.浏览器访问 http://localhost:8088/furn
前端显示
后端显示
2024-06-17 13:38:33.476 INFO 11584 — [nio-8088-exec-3] com.zzw.HiController : furn-Furn(id=100, name=家居, price=6000)
2024-06-17 13:38:33.476 INFO 11584 — [nio-8088-exec-3] com.zzw.HiController : furn=Furn(id=100, name=家居, price=6000), myfurn=Furn(id=100, name=家居, price=6000)
前提:
1.Furn实体类要有toString方法, 否则后端输出对象地址.
2.Furn实体类要有setter方法, 因为application.properties中的属性通过setter方法设置, 否则后端输出null.
3.Furn实体类要有getter方法, 因为furn.id furn.name是通过getId和getName方法获取的, 否则前端不输出JSON信息.
Spring Initializr
Spring Initializr介绍
●Spring Initializr作用
1.程序员通过Maven Archetype
来生成Maven
项目, 项目原型相对简陋, 需要手动配置, 但是比较灵活.
2.通过Spring
官方提供的Spring Initializr
来构建Maven
项目, 能完美支持IDEA
和`Eclipse, 让程序员来选择需要的开发场景(starter), 还能自动生成启动类和单元测试代码.
3.Spring Initializr
对 Idea
版本有要求, 同时还要走国外网络, 我们还是习惯使用Maven Archetype
来生成Maven
项目. 但是作为知识点, 还是要介绍一下.
Spring Initializr使用演示
需求说明
使用Spring Initializr创建SpringBoot项目, 并支持web应用场景, 支持MyBatis.
方式1: IDEA创建
1.创建项目
2.选择 Spring Initializr. 如果没有看到这个选项, 需要安装Spring Initializr插件
3.项目设置
4.选择需要的开发场景
5.项目创建好后, 自动生成启动类和单元测试代码
方式2: start.spring.io创建
https://start.spring.io/
注意事项和说明
1.如果通过Spring Initializr
创建项目, pom.xml
爆红
2.解决方案: 指定版本和当前的springboot
一致, 刷新maven
即可解决
yaml语法
yaml介绍
●基本说明
1.YAML是"YAML Ain’t Markup Language"(YAML不是一种标记语言)的递归缩写. 在开发这种语言时, YAML的意思其实是: “Yet Another Markup Language”(仍是一种标记语言), 是为了强调这种语言以数据作为中心, 而不是以标记语言为重点, 而用反向缩略语重命名. 百度百科
●解读
1.YAML 以数据作为中心, 而不是以标记语言为重点.
2.YAML 仍然是一种标记语言, 但是和传统的标记语言不一样, 是以数据为中心的标记语言.
3.YAML 非常适合用来做以数据为中心的配置文件 [springboot: application.yml]
使用文档
官方文档: https://yaml.org/
yaml for java: https://www.cnblogs.com/strongmore/p/14219180.html
yaml基本语法
1.形式为 key: value, 注意: 后面有空格
2.区分大小写:
3.使用缩进表示层级关系
4.缩进不允许使用tab, 只允许空格 [有些地方也是别tab, 推荐使用空格]
5.缩进的空格数不重要, 只要相同层级的元素左对齐即可
6.字符串无需加引号
7.yaml中, 注释使用 #
数据类型
字面量
1.字面量: 单个的, 不可再分的值. date, boolean, string, number, null
2.number可以表示整数, 浮点数.
3.保存形式为key: value
对象
1.对象: 键值对的集合, 比如map, hash, object
行内写法: k: {k1: v1, k2: v2, k3: v3}
monster: {id: 100, name: 牛魔王}
或
换行形式:
k:
k1: v1
k2: v2
k3: v3
monster:
id: 100
name: 牛魔王
skill: 芭蕉扇
2.举例说明
数组
1.数组: 一组按次序排列的值, 比如 array, list, set, queue
行内写法: k: [v1, v2, v3]
hobby: [打篮球, 踢足球, 打羽毛球]
或
换行形式:
k:
- v1
- v2
- v3
hobby:
- 打篮球
- 踢足球
- 打羽毛球
2.举例说明
yaml应用实例
需求图解
需求: 使用yaml配置文件 和 JavaBean 进行数据绑定, 体会 yaml 使用方式
1.创建项目 configuration, 完成yaml的使用
2.运行效果
代码实现
1.创建一个新的 SpringBoot 项目 configuration, 我们这里用灵活配置的方式创建.
2.在pom.xml引入lombok
, 并切换一下springboot
版本
<!--导入springboot父工程-规定写法-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
</parent>
<dependencies>
<!--导入web项目场景启动器, 会自动地导入和web开发相关的所有依赖[库/jar]-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入lombok, 使用版本仲裁-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
3.创建src/main/java/com/zzw/springboot/bean/Car.java
.
小细节: 创建的bean
需要在SpringBootApplication
包或者其子包, 否则默认不会被扫描, 同时也不能完全使用lombok
的相关简化注解.
@Data
public class Car {
private String name;
private double price;
}
4.创建src/main/java/com/zzw/springboot/bean/Monster.java
@Component
@Data
public class Monster {
private Integer id;
private String name;
private Integer age;
private Boolean isMarried;
private Date birth;
private Car car;
private String[] skill;
private List<String> hobby;
private Map<String, Object> wife;
private Set<Double> salaries;
private Map<String, List<Car>> cars;
}
5.创建src/main/java/com/zzw/springboot/controller/HiController.java
@RestController
public class HiController {
@Autowired
private Monster monster;
@RequestMapping("/monster")
public Monster monster() {
return monster;
}
}
6.创建src/main/java/com/zzw/springboot/Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
7.启动项目, 进行测试. 为空, 说明还没有对数据进行配置绑定.
8.创建src/main/resources/application.yml
, 演示各种写法. 提示: 编写application.yml 时, 这些Bean的字段是可以通过安装插件或jar来自动提示的, 后面会学到, 现在先苦后甜.
monster:
id: 100
name: 牛魔王
age: 200
isMarried: true
birth: 2000/10/15
9.配置Furn
. 参考properties的配置绑定
@ConfigurationProperties(prefix = "monster")
public class Monster {}
10.重启,测试
11.完成后面数据的绑定
monster:
id: 100
name: 牛魔王
age: 200
isMarried: true
birth: 2000/10/15
#对象
# car: {name: 奔驰, price: 120000} #行内风格
car:
name: 奔驰
price: 160000 #换行风格
#数组
# skill: [芭蕉扇, 七十二变, 刀枪不入] #行内风格
skill:
- 芭蕉扇~
- 七十二变~
- 刀枪不入~ #换行风格
hobby:
- 喝酒
- 吃肉
- 陪老婆 #换行风格
#map-属于对象
# wife: {no1: 铁扇公主, no2: 狐狸精} #行内风格
wife:
no1: 铁扇公主
no2: 狐狸精 #换行风格
#set-属于对象
# salaries: [10000, 20000, 30000] #行内风格
salaries:
- 10000
- 20000
- 30000 #换行风格
cars: # 因为cars k-v v是List<Car> 所以我们使用换行风格
group1:
- {name: 奔驰, price: 120000}
- name: 奥迪
price: 130000
group2:
- {name: 宝马, price: 110000}
- name: 兰博基尼
price: 300000
注意事项和使用细节
1.如果application.properties
和 application.yml
有相同的前缀值绑定, 则application.properties
优先级高, 开发时, 应当避免.
2.字符串无需加引号, 如果你用" " 或者 ’ ’ 包起来, 也可以.
3.解决yaml
和 properties
配置文件, 不提示字段信息问题
1)如图, 我们可以知道, 在编写application.yaml
文件时, 不提示Monster
的字段信息, 非常不方便
2)在pom.xml
加入spring-boot-configuration-processor
依赖, 可以从quickstart
项目拷贝.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<!--
这里我们配置optional为true
说明: 表示防止将此依赖传递到其它模块
-->
<optional>true</optional>
</dependency>
3)对application.yml
文件编辑, 就会提示字段. 提示: 输入你在Bean
中配置的prefix
, 就会提示
4)提示: 如果还没有提示, 可以安装一个yaml
插件来搞定.
WEB开发-静态资源访问
官方文档
在线文档:
基本介绍
1.只要静态资源放在类路径下: /static, /public, /resources, /META-INF/resources 可以被直接访问 - 对应文件 WebProperties.java
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { “classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/” };
2.常见静态资源: JS, CSS, 图片(.jpg, .png, .gif, .bmp, .svg), 字体文件(Fonts)等
3.访问方式: 默认: 项目根路径 / + 静态资源名, 比如 http://localhost:8080/1.jpg - 设置WebMvcProperties.java
private String staticPathPattern = “/**”;
快速入门
1.创建SpringBoot
项目springbootweb
, 这里使用灵活配置方式来创建项目, 参考springboot快速入门
2.创建相关静态资源目录, 并放入测试图片, 没有目录, 自己创建即可
, 浏览器访问 http://localhost:8080/4.png , 完成测试.
注意事项和细节
1.静态资源访问原理: 静态映射是 /** , 也就是对所有请求拦截. 请求进来, 先看Controller能不能处理, 不能处理的请求交给静态资源处理器, 如果静态资源找不到则响应404页面.
2.改变静态资源访问前缀, 比如我们希望 http://localhost:8080/image/1.png 去请求静态资源.
应用场景: http://localhost:8080/1.png, 静态资源访问前缀和控制器请求路径冲突
被Controller拦截
解决方案:
1)创建src/main/resources/application.yml
spring:
mvc:
static-path-pattern: /image/**
2)启动, http://localhost:8080/image/1.png 测试
3.改变默认的静态资源路径, 比如希望在类路径下增加zzwimg
目录 作为静态资源路径, 并完成测试.
1)如图所示
2)配置 application.yml
, 增加路径
spring:
mvc:
static-path-pattern: /image/** #修改静态资源访问 路径/前缀
web:
resources:
#修改/指定 静态资源的访问路径/位置
static-locations: [classpath:/zzwimg/] #String[] staticLocations
3)测试, 浏览器输入 http://localhost:8080/image/6.png
(没错, 是image/6.png
, 不是image/zzwimg/6.png
), 一定要保证工作目录target
下 有 6.png
, 如果没有, 请rebuild
下项目, 再重启项目.
4)如果你配置 static-locations
, 原来的访问路径就会被覆盖, 如果需要保留, 再指定一下即可.
web:
resources:
#修改/指定 静态资源的访问路径/位置 String[] staticLocations
static-locations: ["classpath:/zzwimg/", "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/"]
Rest风格请求处理
基本介绍
1.Rest
风格支持 (使用HTTP
请求方式来表示对资源的操作)
2.举例说明
请求方式: /monster
GET-获取妖怪
DELETE-删除妖怪
PUT-修改妖怪
POST-保存妖怪
应用实例
1.创建src/main/java/com/zzw/springboot/controller/MonsterController.java
@RestController
public class MonsterController {
//等价的写法
//@RequestMapping(value = "/monster", method= RequestMethod.GET)
@GetMapping("/monster")
public String getMonster() {
return "GET-查询妖怪";
}
//等价写法
//@RequestMapping(value = "/monster", method = RequestMethod.POST)
@PostMapping("/monster")
public String saveMonster() {
return "POST-保存妖怪";
}
//等价写法
@RequestMapping(value = "/monster", method = RequestMethod.PUT)
@PutMapping("/monster")
public String putMonster() {
return "PUT-修改妖怪";
}
//等价写法
@RequestMapping(value = "/monster", method = RequestMethod.DELETE)
@DeleteMapping("/monster")
public String deleteMonster() {
return "DELETE-删除妖怪";
}
}
2.使用Postman完成测试, 请求url: http://localhost:8080/monster
注意事项和细节
在SpringMVC中我们学过,SpringMVC系列四: Rest-优雅的url请求风格
1.客户端是Postman
可以直接发送 Put, Delete
等方式请求, 可不设置Filter
.
2.如果要SpringBoot
支持 页面表单的Rest功能, 则需要注意如下细节
1)Rest
风格请求核心Filter: HiddenHttpMethodFilter
, 表单请求会被HiddenHttpMethodFilter
拦截, 获取到表单_method
的值, 再判断是PUT/DELETE/PATCH
(注意: PATCH
方法是新引入的, 是对PUT
方法的补充, 用来对已知资源进行局部更新, PATCH和PUT方法的区别)
2)如果要SpringBoot
支持 页面表单的Rest功能, 需要在application.yml
启用filter
功能, 否则无效.
3)修改application.yml
, 启用filter
功能
spring:
mvc:
static-path-pattern: /image/** #修改静态资源访问 路径/前缀
hiddenmethod:
filter:
enabled: true #启动HiddenHttpMethodFilter, 支持rest
4)修改对应的页面, 然后测试.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>rest</title>
</head>
<body>
<h1>测试rest风格的url, 完成get请求</h1>
<form action="/monster" method="get">
u: <input type="text" name="name"><br/>
<input type="submit" value="点击提交">
</form>
<h1>测试rest风格的url, 完成post请求</h1>
<form action="/monster" method="post">
u: <input type="text" name="name"><br/>
<input type="submit" value="点击提交">
</form>
<h1>测试rest风格的url, 完成put请求</h1>
<form action="/monster" method="post">
<!--通过隐藏域传递_method参数指定值-->
<input type="hidden" name="_method" value="PUT">
u: <input type="text" name="name"><br/>
<input type="submit" value="点击提交">
</form>
<h1>测试rest风格的url, 完成delete请求</h1>
<form action="/monster" method="post">
<input type="hidden" name="_method" value="delete">
u: <input type="text" name="name"><br/>
<input type="submit" value="点击提交">
</form>
</body>
</html>