springboot系列七: Lombok注解,Spring Initializr,yaml语法

老韩学生

  • Lombok
    • Lombok介绍
    • Lombok常用注解
    • Lombok应用实例
      • 代码实现
      • idea安装lombok插件
  • Spring Initializr
    • Spring Initializr介绍
    • Spring Initializr使用演示
      • 需求说明
      • 方式1: IDEA创建
      • 方式2: start.spring.io创建
    • 注意事项和说明
  • yaml语法
    • yaml介绍
    • 使用文档
    • yaml基本语法
    • 数据类型
      • 字面量
      • 对象
      • 数组
    • yaml应用实例
      • 需求图解
      • 代码实现
      • 注意事项和使用细节

在这里插入图片描述


⬅️ 上一篇: springboot系列六: springboot底层机制实现 下


🎉 欢迎来到 springboot系列七: Lombok注解,Spring Initializr,yaml语法 🎉

在本篇文章中,我们将探索 Lombok 注解的使用,Spring Initializr 的功能以及 yaml 语法的基本用法。这些工具和技术将帮助您更高效地开发 Spring Boot 应用程序。


🔧 本篇需要用到的项目: quickstart项目


Lombok

Lombok介绍

●Lombok介绍
1.简化JavaBean开发, 可以使用Lombok的注解让代码更加简洁. mybatis中学习过

2.Java项目中, 很多没有技术含量又必须存在的代码, POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些代码既没有技术含量,又影响着代码的美观,Lombok应运而生。

SpringBootIDEA官方支持
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 InitializrIdea 版本有要求, 同时还要走国外网络, 我们还是习惯使用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 {@Autowiredprivate 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: 100name: 牛魔王age: 200isMarried: truebirth: 2000/10/15

9.配置Furn. 参考properties的配置绑定

@ConfigurationProperties(prefix = "monster")
public class Monster {}

10.重启,测试

在这里插入图片描述

11.完成后面数据的绑定

monster:id: 100name: 牛魔王age: 200isMarried: truebirth: 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: 130000group2:- {name: 宝马, price: 110000}-  name: 兰博基尼price: 300000

注意事项和使用细节

1.如果application.propertiesapplication.yml 有相同的前缀值绑定, 则application.properties优先级高, 开发时, 应当避免.

在这里插入图片描述

2.字符串无需加引号, 如果你用" " 或者 ’ ’ 包起来, 也可以.

在这里插入图片描述

3.解决yamlproperties配置文件, 不提示字段信息问题

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插件来搞定.

在这里插入图片描述


🔜 下一篇预告: [即将更新,敬请期待]


📚 目录导航 📚

  1. springboot系列一: springboot初步入门
  2. springboot系列二: sprintboot依赖管理
  3. springboot系列三: sprintboot自动配置
  4. springboot系列四: sprintboot容器功能
  5. springboot系列五: springboot底层机制实现 上
  6. springboot系列六: springboot底层机制实现 下
  7. springboot系列七: Lombok注解,Spring Initializr,yaml语法

💬 读者互动 💬
在使用 Lombok 注解,Spring Initializr 和 yaml 语法的过程中,您有哪些体会或问题?欢迎在评论区留言,让我们一起讨论吧!😊


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 日志框架Serilog使用

1、框架和说明 C#日志框架Serilog支持多种场景输出&#xff0c;简单验证了一下&#xff0c;比较方便 包的安装&#xff0c;推荐直接使用“推荐NuGet包管理器”安装Serilog.AspNetCore&#xff0c;常见的组件都已经集成在一个包中&#xff0c;使用比较方便 2、配置文件 Serilog…

Rethinking Semantic Segmentation: A Prototype View 2022CVPR Oral

流行的语义分割方案的掩码解码策略&#xff08;基于参数softmax或基于像素查询&#xff09;视为可学习的类原型。本研究揭示了这种参数分割策略的几个局限性&#xff0c;并提出了一种基于不可学习原型的非参数替代方案。与之前的方法以完全参数化的方式为每个类学习单个权重/查…

【代码随想录算法训练营第五十二天|647.回文子串、516.最长回文子序列】

文章目录 647.回文子串动态规划双指针法 516.最长回文子序列 647.回文子串 动态规划 dp[i][j]指的是s[i:j1]这段是否是回文串&#xff0c;如果s[i]s[j]需要分三种情况来判断&#xff0c;如果ij或者ji1&#xff0c;那么就是回文串&#xff0c;否则还要看这中间的是否是回文串&…

Kubernetes面试整理-如何利用PodSecurityPolicies来提高集群的安全性?

PodSecurityPolicy (PSP) 是 Kubernetes 中用于定义和控制 Pod 安全配置的策略。通过 PSP,可以设置对 Pod 的一些安全约束条件,从而提高集群的安全性。虽然 PSP 从 Kubernetes 1.21 开始已被弃用,并在 1.25 版本中移除,但在一些旧版 Kubernetes 集群中,PSP 仍然是一个重要…

ubuntu22.04编译安装tesseract

1、 为什么用自己编译安装&#xff0c;而不采用apt安装&#xff1f; 由于tesseract有很多依赖包&#xff0c;直接用deb包或者rpm包等安装包安装很复杂&#xff0c;不一定能成功安装。 2、安装基本的依赖包 sudo apt update sudo apt install g autoconf automake libtool pkg…

Docker-Compose一键部署项目

Docker-Compose一键部署项目 目录 Docker-Compose一键部署项目介绍部署Django项目项目目录结构 docker-compose.ymlnginx的default.conf文件后端Dockerfile文件mysql.env一键部署DNS域名解析引起的跨域问题 介绍 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的…

如何排查Java应用的死锁

排查Java应用中的死锁问题是一个复杂但重要的任务&#xff0c;因为死锁会导致应用程序停止响应&#xff0c;影响用户体验和系统稳定性。以下是一些方法和步骤&#xff0c;帮助你排查Java应用中的死锁。 1. 理解死锁的概念 在计算机科学中&#xff0c;死锁是指两个或多个线程相…

新手向导:掌握Axure RP的第一步

其实很多时候&#xff0c;我们很容易把教程做得太复杂&#xff0c;让学生失去重点被复杂的理论吓到。入门基础的时候只需要先弄清楚两个核心内容&#xff0c;学起来就容易多了:一是简单了解这个软件&#xff0c;二是学习这个软件的基本操作。所以如果你问我什么是好的 Axure RP…

cesium升级到116版本后底图和地形加载问题

cesium在2023-07-03 升级到了107版本&#xff0c;107版本加载底图和地形方式做了变更&#xff0c;之前的imageryProvider 和 CesiumTerrainProvider方式被remove掉了&#xff0c;换了另外方式。变更如下所示&#xff1a; cesium/CHANGES.md at 1.116 CesiumGS/cesium GitHub…

【QCustomPlot实战系列】QCPGraph折线图的渐变

包含折线图渐变效果以及QCPAxisTickerDateTime的使用 static QBrush GenerateLinearBrush(Qt::Orientation orientation) {qreal x 1;qreal y 0;if (orientation Qt::Vertical) {x0;y1.5;}QLinearGradient gradient(0, y, x, 0);gradient.setCoordinateMode(QLinearGradie…

USB描述符的一些解释

USB设备描述符、配置描述符和一些数据缓冲区的数组。让我们逐步解析这些数组中的值。 设备描述符 (Device Descriptor) UINT8C DevDesc[18] = {0x12, 0x01, 0x10, 0x01, 0xff, 0x00, 0x02, 0x08,0x86, 0x1a, 0x23, 0x55, 0x04, 0x03, 0x00, 0x00,0x00, 0x01};0x12 (18): 设备…

Spring Boot中的分布式缓存方案

Spring Boot中的分布式缓存方案 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Spring Boot应用中实现分布式缓存的方案&#xff0c;以提升系统…

软件需求管理规程(DOC原件)

软件需求管理规程是确保软件开发过程中需求清晰、一致、可追踪的关键环节&#xff1a; 明确需求&#xff1a;项目初期&#xff0c;与利益相关者明确项目目标和需求&#xff0c;确保需求完整、无歧义。需求评审&#xff1a;组织专家团队对需求进行评审&#xff0c;识别潜在风险和…

解释Java中的接口和抽象类的使用场景。

在Java中&#xff0c;接口和抽象类是两种特殊的类类型&#xff0c;它们各自有不同的使用场景。 **接口&#xff08;Interface&#xff09;** 接口是一种契约&#xff0c;它定义了一组方法的契约&#xff0c;这些方法在实现类中必须实现。它们常常被用来定义一种规范或者标准&…

【前端】前端文件下载方式盘点

前端文件下载方式盘点 在前端开发中&#xff0c;文件下载是一个常见的功能需求。本文将介绍几种常见的前端文件下载方式&#xff0c;分析各自的优缺点&#xff0c;并提供具体的实现代码。 1. 使用 HTML 的 <a> 标签 优点 简单易用&#xff0c;适用于下载静态文件。浏…

【SQL】⼀条更新语句的执行流程

在关系型数据库管理系统&#xff08;RDBMS&#xff09;中&#xff0c;一条更新语句&#xff08;例如UPDATE语句&#xff09;的执行流程涉及多个步骤&#xff0c;以确保数据的一致性、完整性和高效性。以下是典型的更新语句执行流程的概述&#xff1a; 解析&#xff08;Parsing&…

CPU的核心和线程怎么理解,选购机器如何考虑CPU性能

CPU的核心和线程是计算机处理器的两个重要概念。 CPU核心&#xff1a;CPU核心是指CPU内部实际执行指令的独立单元&#xff0c;每个核心可以独立处理任务。一个CPU可以有一个或多个核心&#xff0c;多核心CPU可以同时处理多个任务&#xff0c;提高计算机的性能。例如&#xff0c…

huggingface加速下载模型

文章目录 所需环境huggingface-cli 用法登录token 获取 huggingface 镜像huggingface 缓存hf-transfer 拉满下载带宽如果开了的话&#xff0c;记得关掉科学上网&#xff01;&#xff01;&#xff01; 所需环境 python huggingface-cli 用法 huggingface-cli的更多用法点击这…

基于SpringBoot+IDEA+Mysql开发的在线课程教育平台

基于SpringBootIDEAMysql开发的在线课程教育平台 项目介绍&#x1f481;&#x1f3fb; 项目背景描述 随着信息技术的迅猛发展和互联网的普及&#xff0c;传统教育模式正面临着前所未有的挑战和机遇。为满足广大用户对于灵活、便捷、高效学习方式的需求&#xff0c;我们决定开发…

Redis 内存碎片是什么?如何清理?

Redis 内存碎片相关的问题在得物、美团、阿里、字节、携程等公司的后端面试中都曾出现过&#xff0c;还是建议认真准备一下。即使不是准备面试&#xff0c;日常开发也是能够用到的&#xff01; 什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存。 举个例子&…