spring框架及使用-黑马vue+spring项目学习笔记

Spring Validation

spring提供的一个参数校验框架,使用预定义的注解完成参数校验 - 直接写if语句数据校验过于繁琐一个参选可能就要写出好几个条件参数一多容易记混写错,同时代码阅读性差

注解作用
@Pattern通过正则表达式校验数据
@NotNull值不能为Null
@NotEmpty值不能为Null,并且内容不为空
@Email满足邮箱格式
@URL满足URL格式

@Pattern使用步骤

  1. 引入Spring Validation起步依赖
1
2
3
4
5
<!--在maven项目的pom.xml中添加-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  1. 在参数前面添加@Pattern注解
1
2
//使用正则表达 5-16个字符
public Result result(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password){}
  1. 在Controller类上添加Validated

使用后一些问题的解决

参数校验失败异常处理

  1. 创建exception包存放异常处理类
  2. 创建全局异常处理类GlobalExceptionHandler
  3. 在类上添加@RestControllerAdvice注解
  4. 使用springframework包下的StringUtils的hasLength可以判断e.gemMessage中是否有封装错误信息
  5. 不想用默认的报错信息也可以选择在@Pattern注解中传入 message参数自定义报错信息
  • 样例
1
2
3
4
5
6
7
8
@RestControllerAdvice  
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result handleException(Exception e) {
e.printStackTrace();
return Result.error(StringUtils.hasLength(e.getMessage())? e.getMessage(): "未知错误");
}
}

使用前效果

使用前效果

使用后效果

@Validated的使用

注解作用
@NotNull值不能为Null
@NotEmpty值不能为Null,并且内容不为空
@Email满足邮箱格式
@Validated加在方法参数对象前面才可以使数据类中是注解生效

分组校验

把校验项进行归类分组,在完成不同的功能的时候校验指定组中的校验项 1.定义分组 2.定义校验项目时指定归属的分组 3.校验时指定要校验的分组

定义分组

假设有有两个分组,分别为Add和Update,则在对应的pojo类中写出这两个名字的接口

1
2
3
4
5
6
7
//设置分组
public interface Add{
//无内容
}
public interface Update{

}

定义校验项目时指定归属的分组

在要校验的对应属性的注解上添加grups分组

1
2
3
4
5
6
//主键ID  
@NotNull(groups = Update.class)
private Integer id;
//分类名称
@NotEmpty(groups = {Update.class,Add.class})
private String categoryName;

校验时指定要校验的分组

在要校验的传入值的@Validated

1
2
3
4
5
@PutMapping  
public Result update(@RequestBody @Validated(Category.Update.class) Category category){
categoryService.update(category);
return Result.success();
}

默认分组及分组的继承

如果说某个校验项没有指定分组,默认属于Default分组。 分组之间可以继承,A extends B 那么A中拥有的B中所有的

自定义校验

已有的注解不能满足所有的校验需求,特殊的情况下需要自定义校验(自定义校验注解) 1.自定义注解State 2.自定义校验数据的类StateValidation实现ConstraintValidator接口 3.在需要校验的地方使用自定义校验

自定义注解State

创建注解类State 注解类State中注解的含义

注解作用
@Documented元注解
@Target({ElementType.FIELD})元注解 表面注解能用在什么上面
@Retention(RetentionPolicy.RUNTIME)元注解 用于标注保留到什么阶段
@Constraint(validatedBy = {StateValidation.class})指定提供校验规则的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//元注解  
@Documented
//元注解 表面注解能用在什么上门
@Target({ElementType.FIELD})
//元注解 用于标注保留到什么阶段
@Retention(RetentionPolicy.RUNTIME)
//指定提供校验规则的类
@Constraint(validatedBy = {StateValidation.class})
public @interface State {
//提供校验失败后失败的提示信息
String message() default "state参数的值只能是已发布或者草稿";
//指定分组
Class<?>[] groups() default {};
//负载 获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}

自定义校验数据的类StateValidation实现ConstraintValidator接口

创建StateValidation并实现ConstraintValidator<给那个注解提供校验规则,校验的数据类型>接口 重写 isValid方法 如果返回false就不通过 返回 true 通过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class StateValidation implements ConstraintValidator<State,String> {  

/**
* * @param s 将来要校验的数据
* @param constraintValidatorContext
* @return 如果返回false就不通过 返回 true 通过
*/
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
//提供校验规则
if(s==null){
return false;
}
return "已发布".equals(s) || "草稿".equals(s);
}
}

Spring Cache

Spring Cahe 是一个框架,实现了基于注解的缓存功能,只需要简单的添加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: - EHCache - Caffeine - Redis

1
2
3
4
<dependency>  
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

常用注解

注解说明
@EnableCaching开启缓存功能,通常加在启动类上
@Cacheable在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存结果;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict
将一条或多条数据从缓存中删除

@CachePut

Spring EL 表达式是Spring表达式语言,支持在xml和注解中使用表达式,类似于JSP的EL,JSTL表达式语言。Spring开发中我们会经常涉及到调用各种资源的情况,包含普通文件、网址、正则表达式、系统变量、其他Bean的一些属性、配置文件、集合等等,我们就可以使用Spring的表达式语言实现资源的注入。 Spring EL的格式为 #{ SpEL expression } 。Spring表达式主要写在注解 @Value的参数中,它的作用是通过spring把值注入给某个属性。

Spring Task

Spirng Task 介绍

应用场景: - 信用卡每月还款提醒 - 银行贷款每月还款提醒 - 火车售票系统处理未支付订单 - 入职纪念日为用户发送通知

Spring Task入门案例

  1. 导入Maven坐标Spring-context
  2. 启动类添加注解@EnableScheduling开启任务调度
  3. 自定义定时任务类

样例

1
2
3
4
5
6
7
8
@Component  
@Slf4j
public class MyTask {
@Scheduled(cron = "0/5 * * * * ?")
public void executeTask(){
log.info("定时任务开始执行:{}",new Date());
}
}