# 第三方库作用及其应用
# commons-io
- 是一组有关 IO 操作的开源工具包,包括文件拷贝、文件删除、文件比较、文件读取、文件写入等等。
 - 有很多工具类:
- StringUtils: 字符串工具类
 - NumberUtils: 数字工具类
 - ArrayUtils: 数组工具类
 - RandomUtils: 随机数工具类
 - DateUtils: 日期工具类
 - StopWatch: 计时器工具类
 - ClassUtils: 反射工具类
 - SystemUtils: 系统工具类
 - MapUtils: 集合工具类
 - BeanUtils: Bean 工具类
 - IOUtils: IO 工具类
 - FileUtils: 文件工具类
 
 
# hutool
- Hutool 是一个 Java 工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让 Java 语言也可以“甜甜的”。
 - 类似 commons-io,提供了很多组件和工具类,实现特定功能。
 
# jakarta.validation:jakarta.validation.api
同下
# org.hibernate.validator:hibernate-validator
javax.validation.constraints 包下,定义了一系列的约束( constraint )注解。共 22 个,如下:
# 空和非空检查
- @NotBlank :只能用于字符串不为 null ,并且字符串 #trim() 以后 length 要大于 0 。
 - @NotEmpty :集合对象的元素不为 0 ,即集合不为空,也可以用于字符串不为 null 。
 - @NotNull :不能为 null 。
 - @Null :必须为 null 。
 
# 数值检查
- @DecimalMax(value) :被注释的元素必须是一个数字,其值必须小于等于指定的最大值。
 - @DecimalMin(value) :被注释的元素必须是一个数字,其值必须大于等于指定的最小值。
 - @Digits(integer, fraction) :被注释的元素必须是一个数字,其值必须在可接受的范围内。
 - @Positive :判断正数。
 - @PositiveOrZero :判断正数或 0 。
 - @Max(value) :该字段的值只能小于或等于该值。
 - @Min(value) :该字段的值只能大于或等于该值。
 - @Negative :判断负数。
 - @NegativeOrZero :判断负数或 0 。
 
# Boolean 值检查
- @AssertFalse :被注释的元素必须为 true 。
 - @AssertTrue :被注释的元素必须为 false 。
 
# 长度检查
- @Size(max, min) :检查该字段的 size 是否在 min 和 max 之间,可以是字符串、数组、集合、Map 等。
 
# 日期检查
— @Future :被注释的元素必须是一个将来的日期。 — @FutureOrPresent :判断日期是否是将来或现在日期。 — @Past :检查该字段的日期是在过去。 — @PastOrPresent :判断日期是否是过去或现在日期。
# 其它检查
- @Email :被注释的元素必须是电子邮箱地址。
 - @Pattern(value) :被注释的元素必须符合指定的正则表达式。
 
# Hibernate Validator 附加的约束注解
org.hibernate.validator.constraints 包下,定义了一系列的约束( constraint )注解。如下:
- @Range(min=, max=) :被注释的元素必须在合适的范围内。
 - @Length(min=, max=) :被注释的字符串的大小必须在指定的范围内。
 - @URL(protocol=,host=,port=,regexp=,flags=) :被注释的字符串必须是一个有效的 URL 。
 - @SafeHtml :判断提交的 HTML 是否安全。例如说,不能包含 javascript 脚本等等。
 
# @Valid 和 @Validated
@Valid 注解,是 Bean Validation 所定义(
javax.validation包下),可以添加在普通方法、构造方法、方法参数、方法返回、成员变量上,表示它们需要进行约束校验。@Validated 注解,是 Spring Validation 所定义(
org.springframework.validation.annotation包下),可以添加在类、方法参数、普通方法上,表示它们需要进行约束校验。同时,@Validated 有 value 属性,支持分组校验。
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
 /**
  * Specify one or more validation groups to apply to the validation step
  * kicked off by this annotation.
  * <p>JSR-303 defines validation groups as custom annotations which an application declares
  * for the sole purpose of using them as type-safe group arguments, as implemented in
  * {@link org.springframework.validation.beanvalidation.SpringValidatorAdapter}.
  * <p>Other {@link org.springframework.validation.SmartValidator} implementations may
  * support class arguments in other ways as well.
  */
 Class<?>[] value() default {};
}
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 两者大致有以下的区别:
 
| 名称 | Spring Validation 是否实现了声明式校验 | 是否支持嵌套校验 | 是否支持分组校验 | 
|---|---|---|---|
| @Validated | 是 | 否 | 是 | 
| @Valid | 否 | 是 | 否 | 
总的来说,绝大多数场景下,我们使用 @Validated 注解即可。而在有嵌套校验的场景,我们使用 @Valid 注解添加到成员属性上。
# com.github.xiaoymin:knife4j-spring-boot-starter
Knife4j。是一个基于 Spring Boot 的 Swagger 增强工具,可以帮助我们更好的管理和维护我们的接口文档。它提供了一些增强功能,比如:接口文档的美化、接口文档的分组、接口文档的权限控制等等。
swagger 相关,调试接口。启动程序,然后再浏览器里我们就可以进行输入: swagger 访问地址:http://localhost:8080/doc.html#/home 打开 swagger 文档 就可以进行测试了。
# org.projectlombok:lombok
注解开发
# spring-boot-starter-web
spring web
# JWT鉴权身份认证
Spring Security 整合 JWT。它是一种基于 JSON 的轻量级令牌,由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT 被广泛用于实现身份验证和授权,特别适用于前后端分离的应用程序。由 header.payload.signature 三部分组成,你可以在此网站: https://jwt.io/ 上获得解析结果。
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>${jjwt.version}</version>
</dependency>
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 日志
Log4j基本被淘汰了,一般使用slf4j+logback的形式。SLF4J 是一个日志门面(facade),使得应用程序可以在运行时更换日志实现。Logback 是日志框架 SLF4J 的一个实现,它被设计用来替代 log4j。Logback 提供了更高的性能,更丰富的日志功能和更好的配置选项。
Spring Boot 默认使用 Logback,所以当你在 pom.xml 中加入 spring-boot-starter-web 依赖时,它会自动包含 Logback 相关依赖,无需额外添加。
<!-- logback.xml示例 -->
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <jmxConfigurator/>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 应用名称 -->
    <property scope="context" name="appName" value="weblog"/>
    <!-- 自定义日志输出路径,以及日志名称前缀 -->
    <property name="LOG_FILE" value="logs/${appName}.%d{yyyy-MM-dd}"/>
    <!-- 使用 %X 来引用MDC中的值 [TraceId: %X{traceId}] -->
    <property name="FILE_LOG_PATTERN"
              value="[TraceId: %X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
    <!--<property name="CONSOLE_LOG_PATTERN" value="${FILE_LOG_PATTERN}"/>-->
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名 -->
            <FileNamePattern>${LOG_FILE}-%i.log</FileNamePattern>
            <!-- 日志文件保留天数 -->
            <MaxHistory>30</MaxHistory>
            <!-- 日志文件最大的大小 -->
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %errorMessage:日志消息,%n 是换行符-->
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- dev 环境(仅输出到控制台) -->
    <springProfile name="dev">
        <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
        <root level="info">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
    <!-- prod 环境(仅输出到文件中) -->
    <springProfile name="prod">
        <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
        <root level="INFO">
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>
</configuration>
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#
#
# com.baomidou:mybatis-plus-boot-starter
# p6spy:p6spy
组件打印完整的 SQL 语句、执行耗时。
# xml 文件解析
- dom4j
 - jaxb-api
 - jaxb-impl
 - jaxb-core
 - jaxb-runtime
 - jaxb-xjc
 - jaxb-jxc
 
# IT-test
- junit
 - cargo-mavenX-plugin
 
# 数据库连接池工具
- druid-spring-boot-starter
 
# JSON Web Token
- io.jsonwebtoken.jjwt
 
# 配置文件解析
- org.springframework.boot:spring-boot-configuration-processor
 
# 常见实现热部署的方式
- JRebel:旨在通过即时应用代码更改来加快开发周期,提高开发效率,通过动态地重载 Java 类,可以大幅减少开发人员在开发应用程序时的等待时间。
 - Spring Loaded
 - spring-boot-devtools
 
# com.google.guava:guava
集合类增强,缓存,函数式编程支持,字符串处理,并发工具
# org.apache.commons:commons-lang3
为 Java 提供各种实用程序类,如 StringUtils, ArrayUtils, NumberUtils 等,简化了常见的操作。时间和日期工具类DateUtils。异常处理辅助:提供类如 ExceptionUtils,帮助更轻松地处理和记录异常。随机数生成:RandomStringUtils。
#
#
#
#
#
# xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ratel</groupId>
    <artifactId>java-validation</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>java-validation</name>
    <description>java validation action</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!-- spring-boot-starter-web 已经引入了 spring-boot-starter-validation,而 spring-boot-starter-validation 中也引入了 hibernate-validator 依赖,所以无需重复引入。 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--在一些高版本springboot中默认并不会引入这个依赖,需要手动引入-->
        <!-- <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <scope>compile</scope>
        </dependency> -->
        <!-- 保证 Spring AOP 相关的依赖包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <!--lombok相关 方便开发-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--knife4j接口文档 方便待会进行接口测试-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73