@RequestMapping:
RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
RequestMapping注解可以作用在方法和类上
作用在类上:第一级的访问目录
作用在方法上:第二级的访问目录
属性: path 指定请求路径的url,value value属性和path属性是一样的,mthod 指定该方法的请求方式
@GetMapping:@RequestMapping(method =RequestMethod.GET) 的一个快捷方式
@PostMapping:@RequestMapping(method =RequestMethod.POST) 的一个快捷方式
@RequestParam:
作用:把请求中的指定名称的参数传递给控制器中的形参赋值
属性:
value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供
@Controller @RequestMapping("/dept") public class DeptController { @RequestMapping("/save") public String save(@RequestParam(value = "username",required = false) String name){ System.out.println(name); return "suc"; } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
@RequestBody
作用:用于获取请求体的内容(注意:get方法不可以),项目中使用该注解接收的是一个实体类
属性:required:是否必须有请求体,默认值是true
@RequestMapping("/save2") public String save2(@RequestBody String body){ System.out.println(body); return "suc"; }
- 1
- 2
- 3
- 4
- 5
@PathVariable
作用:URL占位符注解,将url中占位符参数绑定到入参,POST和GET均支持。属于RestFul风格
@PostMapping("/list/{currentPage}/{pageSize}") public ResultJson index(@PathVariable Integer currentPage, @PathVariable Integer pageSize, @RequestBody PolicyCategory policyCategory) { QueryWrapper<PolicyCategory> queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(policyCategory.getName())) { queryWrapper.like("name", policyCategory.getName()); } queryWrapper.eq("dic_policy_category.delete_flag", 0); IPage<PolicyCategory> pageList = policyCategoryService.page(new Page<>(currentPage, pageSize), queryWrapper); return ResultJson.ok(pageList); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
请求路径:localhost:8080/v1/list/1/10
@Param
mapper中在参数前加,让xml的sql语句可以识别该参数,使用该参数就可以不用parameterType声明入参类型
对基础类型使用
public Integer userNumberOfRegistrationsToday(@Param("comparisonTime") String comparisonTime);
- 1
<select id="userNumberOfRegistrationsToday" parameterType="java.lang.String" resultType="java.lang.Integer"> select count(*) from t_enterprise_user where create_time >= #{comparisonTime} and delete_flag = 0 select>
- 1
- 2
- 3
- 4
- 5
- 6
对象参数使用
@Param(“user”) User u
xml中#{user.userName}
@Autowired :spring提供的注解默认按类型进行自动装配(引用类型),不需要写值,IDEA可能存在误报(不影响实际使用)
@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired () @Qualifier ( "baseDao" ) private BaseDao baseDao;
- 1
- 2
@Resource :Java提供的注解,也被支持。使用name属性,按名称注入,只能在引用类型中使用
如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@PreAuthorize
PreAuthorize("hasAuthority('/enterprise')")
- 1
通过判断集合中有没有该字段,判断是否有该权限
@NoRepeatSubmit
redis中防重复提交的注解,底层是利用redis的分布式锁完成,通过权限参数,来判断是否是同一个用户,是的话,就不允许发起操作
@ApiVersion
加在类上,控制版本号,有些版本可以会增强新的功能,他们核心代码相同,保证多个版本可以同时运行
@RequestMapping(“{version}/test”)
前端的访问路径前缀
”/v1/test/....""
- 1
作用在类上,可以用来创建bean实例,把当前类注入到spring容器中
本项目常用的是**@Controller 表现层在controller类上,@Service 业务层**在service实现类上
@RestController
@RestController是Controller的子集(孩子功能单一且强大),相当于requestbody+controller,把所有返回客户端的数据是json格式
@Data
@Data 组合注解,包含get/set,tostring,equal和hashcode的方法
@Builder
会生成一个全参构造方法
因此就没有了无参构造方法,但当我们遇到需要无参构造方法时就会发生问题
解决方法:加上@AllArgsConstructor注解:提供一个包含所有参数的构造函数
@TableName
类注解,定义在实体类上方,设置当前类对应于数据库表关系
@TableName("t_test")
- 1
@TableField
属性注解,定义类属性上方,设置当前属性对应的数据库表中的字段关系
value(默认):设置数据库表字段名称
exist:设置属性在数据库表字段中是否存在,默认为true,此属性不能与value合并使用
select:设置属性是否参与查询,此属性与select()映射配置不冲突
fill:设置自动填充内容,默认值是:FieldFill.DEFAULT不处理。INSERT,插入时填充字段。UPDATE,更新时填充字段。INSERT_UPDATE,插入和更新时填充字段。
@TableId
属性注解,定义表示主键的属性上方,value(默认):设置数据库表主键名称,type:设置主键属性的生成策略,值查照IdType的枚举值
AUTO策略:让数据库ID自增
@JsonFormat
定义类属性上方,只会在声明返回json时,比如(@ResponseBody)返回json数据时,才会返回格式化的数据
Json返回给前端的时候,有时候数据类型是 BigDecimal 这种长度较大的类型
而直接json化返回给前端的话,存在一个丢失精度的情况,因此,需要转换成String类型再返回给前端
pattern:是你需要转换的格式
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
- 1
@Excel
自定义的Excel注解,方便导出excel表格的时候,展示出来
@Log
注入一个日志类对象,自定义操作日志记录注解
@Slf4j
@Slf4j是用作日志输出的,作用到类上,开启后打印当前类日志
@Api
用在请求的类上,表示对类的说明
tags=“说明该类的作用,可以在前台界面上看到的注解”
value=“该参数无意义,在UI界面上看不到,不需要配置”
@ApiModelProerty
用在属性上,表示对属性的说明,或者数据操作更改
value–字段说明,name–重写属性名字
@ApiModel
用在响应类上,表示一个返回响应数据的信息
一般用在post 创建,使用@RequestBody的时候
请求参数无法使用@ApiImplicitParam
@ApiResponses和@ApiResponse
@ApiResponses: 用在请求的方法上,表示一组响应
@ApiResponse: 用在@ApiResponses 中,一般用于表达一个错误的响应信息,
code: 数字代码
message: 信息,例:“操作失败”
response:抛出异常的类
@ApiImplicitParams和@ApiImplicitParam
@ApiImplicitParams:用在请求的方法上,表示一组参数说明
@ApiImplicitParam: 用在@ApiImplicitParams 注解中,指定一个请求参数的各个方面name: 参数名
value: 参数的说明、解释
required: 是否必须传参
paramType:参数放什么位置
dataType: 参数类型,默认String,其它值dataType=“Integer”
defaultValue: 参数的默认值/** *根据id查找企业 * @param: id * @return */ @PreAuthorize("hasAuthority('/enterprise/findById')") @ApiImplicitParams({@ApiImplicitParam(name = "Authorization", value = "Authorization token", required = true, dataType = "string", paramType = "header")}) @GetMapping("/getById/{id}") public ResultJson getEnterpriseById(@PathVariable Long id) { Enterprise enterprise = enterpriseService.getById(id); return enterprise != null? ResultJson.ok(enterprise): ResultJson.failure(ResultCode.BAD_REQUEST); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这里的参数Authorization,可以用于**@NoRepeatSubmit**判断是否同一个用户,来完成不可重复提交
**@EnableScheduling和@Scheduled **
@Component :将这个类放到spring ioc 容器中来帮助我们管理这个类
@Scheduled :开启定时任务,应用于方法上
需要在springboot 的启动类上面加上启动定时任务的注解@EnableScheduling
用法:
Cron表达式
// 当方法的执行时间超过任务调度频率时,调度器会在下个周期执行 @Scheduled(cron = "0/10 * * * * *") private void cronSchedule() { System.out.println("定时任务"); }
- 1
- 2
- 3
- 4
- 5
固定间隔
// 固定间隔,等上一次调度完成后,再开始计算间隔,再执行 @Scheduled(fixedDelay = 5000) public void fixedDelaySchedule() { System.out.println("定时任务"); }
- 1
- 2
- 3
- 4
- 5
固定频率
// 固定频率,如果上次调度超过了频率时间,那么在其完成后,立刻执行 @Scheduled(fixedRate = 3000) public void fixedRateSchedule() { System.out.println("定时任务"); }
- 1
- 2
- 3
- 4
- 5
注意 :Spring的Schecule默认是单线程执行的,如果你定义了多个任务,那么他们将会被串行执行,会严重不满足你的预期。所以为了解决该问题,需要自定义线程池
/** * 自定义线程池 */ @Component public class ScheduleConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(customScheduler()); } @Bean(destroyMethod = "shutdown") public ExecutorService customScheduler() { return Executors.newScheduledThreadPool(20); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17