• SpringBoot项目常用注解


    SpringBoot项目常用注解

    请求类型

    • @RequestMapping:

    • RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

      RequestMapping注解可以作用在方法和类上

      作用在类上:第一级的访问目录

      作用在方法上:第二级的访问目录

      属性: path 指定请求路径的url,value value属性和path属性是一样的,mthod 指定该方法的请求方式

    • @GetMapping:@RequestMapping(method =RequestMethod.GET) 的一个快捷方式

    • @PostMapping:@RequestMapping(method =RequestMethod.POST) 的一个快捷方式

    参数传递

    Controller层使用

    • @RequestParam

      作用:把请求中的指定名称的参数传递给控制器中的形参赋值

      属性:

      1. value:请求参数中的名称

      2. 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

      image-20220726104521429

    • @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风格

      image-20220726104610847

      @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

    Mapper层使用

    • @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属性一旦指定,就只会按照名称进行装配。

    image-20220726110554891

    权限控制、不可重复提交、版本控制

    • @PreAuthorize

    • PreAuthorize("hasAuthority('/enterprise')")
      
      • 1

      通过判断集合中有没有该字段,判断是否有该权限

    • @NoRepeatSubmit

    • redis中防重复提交的注解,底层是利用redis的分布式锁完成,通过权限参数,来判断是否是同一个用户,是的话,就不允许发起操作

      image-20220726111005068

    • @ApiVersion

    • 加在类上,控制版本号,有些版本可以会增强新的功能,他们核心代码相同,保证多个版本可以同时运行

      @RequestMapping(“{version}/test”)

      image-20220726111233510

      前端的访问路径前缀

      ”/v1/test/....""
      
      • 1

    Bean管理

    作用在类上,可以用来创建bean实例,把当前类注入到spring容器中

    • @Component 普通的类
    • @Controller 表现层
    • @Service 业务层
    • @Repository 持久层

    本项目常用的是**@Controller 表现层在controller类上,@Service 业务层**在service实现类上

    • @RestController

    • @RestController是Controller的子集(孩子功能单一且强大),相当于requestbody+controller,把所有返回客户端的数据是json格式

    实体类相关

    Lombok注解

    • @Data

    • @Data 组合注解,包含get/set,tostring,equal和hashcode的方法

    • @Builder

    • 会生成一个全参构造方法

      因此就没有了无参构造方法,但当我们遇到需要无参构造方法时就会发生问题

      解决方法:加上@AllArgsConstructor注解:提供一个包含所有参数的构造函数

    image-20220726112618897

    MybatisPlus注解

    • @TableName

    • 类注解,定义在实体类上方,设置当前类对应于数据库表关系

      @TableName("t_test")
      
      • 1
    • @TableField

    • 属性注解,定义类属性上方,设置当前属性对应的数据库表中的字段关系

      value(默认):设置数据库表字段名称

      exist:设置属性在数据库表字段中是否存在,默认为true,此属性不能与value合并使用

      select:设置属性是否参与查询,此属性与select()映射配置不冲突

      fill:设置自动填充内容,默认值是:FieldFill.DEFAULT不处理。INSERT,插入时填充字段。UPDATE,更新时填充字段。INSERT_UPDATE,插入和更新时填充字段。

      image-20220726113948190

      image-20220726113501116

    • @TableId

    • 属性注解,定义表示主键的属性上方,value(默认):设置数据库表主键名称,type:设置主键属性的生成策略,值查照IdType的枚举值

      AUTO策略:让数据库ID自增

      image-20220726113759766

    格式化数据注解

    • @JsonFormat

    • 定义类属性上方,只会在声明返回json时,比如(@ResponseBody)返回json数据时,才会返回格式化的数据

      Json返回给前端的时候,有时候数据类型是 BigDecimal 这种长度较大的类型

      而直接json化返回给前端的话,存在一个丢失精度的情况,因此,需要转换成String类型再返回给前端

      pattern:是你需要转换的格式

      @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
      
      • 1

      image-20220726114539628

    Excel相关

    • @Excel

    • 自定义的Excel注解,方便导出excel表格的时候,展示出来

      image-20220726114810103

      image-20220726114835955

    日志相关

    • @Log

    • 注入一个日志类对象,自定义操作日志记录注解

      image-20220726145323416

    • @Slf4j

    • @Slf4j是用作日志输出的,作用到类上,开启后打印当前类日志

      image-20220726145420352

    swagger的注解

    • @Api

    • 用在请求的类上,表示对类的说明

      tags=“说明该类的作用,可以在前台界面上看到的注解”
      value=“该参数无意义,在UI界面上看不到,不需要配置”

      image-20220726150905637

    • @ApiModelProerty

    • 用在属性上,表示对属性的说明,或者数据操作更改

      value–字段说明,name–重写属性名字

      image-20220726151020086

    • @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
  • 相关阅读:
    大比拼:讯飞星火大模型将超越ChatGPT?
    mediakit 源码 轻微微 学习总结
    echart在折线显示横纵(横纵线沿着折线展示)
    LR学习笔记——基本面板
    讲解器厂家深层互联重磅发布行业首个头戴式无线讲解器
    前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。
    超详细!手把手带你实现一个完整的Promise
    牛血清白蛋白修饰葡萄糖 BSA-glucose,木糖/半乳糖/乳糖偶联牛血清白蛋白
    力扣174. 寻找二叉搜索树中的目标节点(java,二叉搜索树的性质的运用)
    python FastAPI 文件下载
  • 原文地址:https://blog.csdn.net/m0_61820867/article/details/125995678