SpringBoot 基础(一)

一、简介

  1. 官方文档 https://spring.io/projects/spring-boot/
  2. Spring Boot 的设计目的是简化 Spring 应用的初始搭建以及开发过程。SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置。
    • 开箱即用(Outofbox):在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。
    • 约定优于配置(Convention over configuration):在项目中会内置一些习惯性配置,如果不需要改变这些配置,可以在很少配置的情况下将项目搭建出来。

二、重要注解

  1. Spirng Boot 会存在一个启动类,*Application,再启动类上有一个 @SpringBootApplication

    • @SpringBootConfiguration:继承了Configuration,表示当前是注解类
    • @EnableAutoConfiguration:开启springboot的注解功能。借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器
    • ComponentScan:@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
    • @Bean:其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id
    • @AutoConfigurationPackage:自动配置包
    • @Import:导入自动配置的组件
    • @EnableScheduling:通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
    • EnableMBeanExport:通过@Import将JMX相关的bean定义加载到IoC容器。

三、基本应用开发

1. lombok的使用

  1. 介绍:简单的注解形式来简化java代码

  2. 通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。但是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。

  3. 常用注解

    • @Data:会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
    • @Getter/@Setter:为相应的属性自动生成Getter/Setter方法
    • @NonNull:用在属性或构造器上,可用于校验参数,能帮助避免空指针。
    • @Cleanup:自动调用close()方法
    • @EqualsAndHashCode:生成equals和hasCode,也能通过exclude注解来排除一些属性。
    • @ToString:生成一个toString()方法
    • @NoArgsConstructor:无参构造器
    • @RequiredArgsConstructor:部分参数构造器
    • @AllArgsConstructor:全参构造器
    • @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd hh:mm:ss"):此注解不属于lombok,属于Jackson。将日期类型格式化为指定形式。

2. SpringBoot 的参数传递

  1. 请求路径传参,使用 url/{id} 的形式接收参数。需要在参数前加上 @PathVariable。或者使用 url?id=1 的形式接收参数,可以在参数前加上 @RequestParam,如果参数名都一致的话,可以不加这个注解。
  2. 使用 @RequestBody 的形式来接收参数。用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。

3. 对象参数校验

  1. 使用@RequestBody的方式传入数据,错误信息也会以json的方式传回。

  2. SpringBoot支持JSR-303 标准的校验

    • @NotNull: 限制必须不为null,注意支持String类型校验
    • @NotEmpty: 验证注解的元素值不为 null 且不为空(字符串长度不为0、集合大小不为0)
    • @NotBlank: 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
    • @Pattern(value): 限制必须符合指定的正则表达式
    • @Size(max,min): 限制字符长度必须在 min 到 max 之间(也可以用在集合上)
    • @Email: 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
    • @Max(value): 限制必须为一个不大于指定值的数字
    • @Min(value): 限制必须为一个不小于指定值的数字
    • @Past: 限制必须是一个过去的日期
    • @Future: 限制必须是一个将来的日期
    • @Pattern(regexp =“el”,message=“msg”):自定义限制和出错信息
    • @Validated: 开启数据有效性校验。添加在类上即为验证方法,添加在方法参数中即为验证参数对象。
    • @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss"):此注解属于spring框架,要求传入的日期对象格式必须如此。
    • @JsonIgnore:忽略字段,不转换为json
    • @JsonInclude:当属性值为空时候,不转换为json
  3. 对于普通参数的校验,需要在方法上加入BindingResult 参数,可以将错误响应到前端。

public String getcarvalidation4(@Validated Car car,BindingResult bindingResult) {
if (bindingResult.hasErrors()){
return bindingResult.getFieldError().getDefaultMessage();
}
return car.toString();
} @InitBinder
private void initBinder(WebDataBinder webDataBinder){
// 对参数的日期进行格式化
webDataBinder.addCustomFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
}
}

4. 静态资源

  1. Spring Boot 默认将 /** 所有访问映射到以下目录。

    • classpath:/static
    • classpath:/public
    • classpath:/resources
    • classpath:/META-INF/resources。
  2. 自定义静态访问

    • 可以通过配置文件的方式实现

      # 自定义静态文件路径配置
      web.upload-path:
      D:/pic/
      spring.mvc.static-path-pattern:
      /**
      spring.resources.static-locations:
      classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
    • 可以通过配置类的形式

      @Configuration
      public class WebMvcConfig implements WebMvcConfigurer {
      @Override
      public void addResourceHandlers(ResourceHandlerRegistry registry) {
      //将所有D:\\springboot\\pic\\ 访问都映射到/myPic/** 路径下
      registry.addResourceHandler("/myPic/**").addResourceLocations("file:D: \\pic\\");
      }
      }
  3. webjars https://www.webjars.org/all

    • 在SpringBoot中,允许我们直接访问WEB-INF/lib下的jar包中的/META-INF/resources目录资源,即WEB-INF/lib/{*.jar}/META-INF/resources下的资源可以直接访问。WebJars也是利用了此功能,将所有前端的静态文件打包成一个jar包,这样对于引用放而言,和普通的jar引入是一样的,还能很好的对前端静态资源进行管理。

    • 静态文件存放规则:META-INF/resources/webjars/${name}/${version}。

    • 创建webjars

      1. src/main/resouces路径下创建META-INF/resources/webjars/demo/0.0.1目录,放置静态资源。

      2. 编写配置类,也可以不写,因为springboot默认的四个资源路径里面就包含了/META-INF/resources/

        @Configuration
        public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //配置映射关系 registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
        }
      3. 在pom中加入配置

        <build>
        <resources>
        <resource>
        <directory>${project.basedir}/src/main/resources</directory> <targetPath>${project.build.outputDirectory}/META-INF/resources/webjars</targetPath>
        </resource>
        </resources>
        </build>
      4. 被其它项目引入

        <dependency>
        <groupId>com.offcn</groupId>
        <artifactId>Webjars-Demo</artifactId>
        <version>1.0</version>
        </dependency>
      5. WebJars使用webjars-locator,可以省略版本号

        <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>webjars-locator-core</artifactId>
        </dependency>
      6. 修改配置类,不然还是去除了版本时路径找不到的。

        @Configuration
        public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //配置映射关系
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").resourceChain(true);//加入resourceChain属性,不然还是去除了版本时路径找不到的
        }
        }

四、SpringBoot 属性

  1. pring Boot并不真正是所谓的『零配置』,他的理念是“习惯优于配置”采用了一些默认的习惯性配置。但是一些配置还是有必要的。

  2. 修改默认。

    # application-prod.yml
    server:
    port: 8888
    servlet:
    context-path: /java001
  3. 自定义常量

    # application-const.yml
    # 自定义常量,可以通过 @Value(“${属性名}”) 读取
    offcn_ip: 1.1.1.1
    offcn_port: 9999
  4. 实体属性赋值

    # application-bean.yml
    # 自定义属性,可以通过 @ConfigurationProperties(prefix="userbody")给实体 bean 赋值
    # 在调用类或者启动类上,使用 @EnableConfigurationProperties({UserBody.class})
    userbody:
    name: zs
    password: 123
    birthday: 1992.10.28
    mobile: 13842098465
    address: 北京市朝阳区
  5. 自定义配置文件

    # 这种自定义,是名字完全自定义,比如test.properties,无法被自动加载。
    # 需要使用注解 @Configuration,如果此注解报错可以使用 @Component
    # @PropertySource("classpath:test.properties")
    # @ConfigurationProperties(prefix = "testuser") testuser.name = "ls"
    testuser.password = "123"
    testuser.birthday = "1978.10.28"
  6. 多环境配置文件

    # application.yml
    spring:
    profiles:
    # 使用命令行选择 profile,使用参数 -Dspring.profiles.active=dev。也可以同时激活多个文件,用逗号分隔。
    active: test
    # 无条件的添加生效的配置
    include: prod,const,bean

五、RESTful

  1. RESTful是一种软件架构风格。数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对应于HTTP方法:

    • GET用来获取资源
    • POST用来新建资源(也可以用于更新资源)
    • PUT用来更新资源
    • DELETE用来删除资源
  2. 以用户数据的基本操作为例:

    HTTP协议请求方法 SpringBoot注解 URL 功能说明
    POST @PostMapping /users 创建一个用户
    GET @GetMapping /users 查询用户列表
    GET @GetMapping /users/id 根据id查询一个用户
    PUT @PutMapping /users/id 根据id更新一个用户
    DELETE @DeleteMapping /users/id 根据id删除一个用户
  3. Swagger2 构建 API 文档

    1. Swagger2这套自动化文档工具来生成文档,它可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大RESTful API文档。

    2. 加入依赖

      <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.2.2</version>
      </dependency>
      <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
      <version>2.2.2</version>
      </dependency>
    3. Swagger2配置类

      @Configuration
      @EnableSwagger2
      public class SwaggerConfig {
      @Bean
      public Docket createRestApi() {
      return new Docket(DocumentationType.SWAGGER_2)
      .apiInfo(apiInfo())
      .select()
      .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
      .paths(PathSelectors.any())
      .build();
      } private ApiInfo apiInfo() {
      return new ApiInfoBuilder()
      .title("Spring Boot中使用Swagger2构建RESTful APIs")
      .description("优就业")
      .termsOfServiceUrl("http://www.ujiuye.com/")
      .contact("Sunny")
      .version("1.0")
      .build();
      }
      }
    4. Controller增加文档注释

      @PutMapping("/{id}")
      @ApiOperation(value="更新指定id用户信息", notes="根据id更新用户信息")
      @ApiImplicitParams({
      @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"),
      @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
      })
      public String updateUser(@PathVariable("id") Long id,User user) {
      for (User user2 : listUser) {
      if(user2.getId().equals(id)) {
      user2.setName(user.getName());
      user2.setAge(user.getAge());
      }
      }
      return "success";
      }
    5. Controller增加文档注释

      @PutMapping("/{id}")
      @ApiOperation(value="更新指定id用户信息", notes="根据id更新用户信息")
      @ApiImplicitParams({
      @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"),
      @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
      })
      public String updateUser(@PathVariable("id") Long id,User user) {
      for (User user2 : listUser) {
      if(user2.getId().equals(id)) {
      user2.setName(user.getName());
      user2.setAge(user.getAge());
      }
      }
      return "success";
      }
    6. 查看Swagger2文档 http://localhost:8080/swagger-ui.html

SpringBoot 基础(一)的更多相关文章

  1. (二)SpringBoot基础篇- 静态资源的访问及Thymeleaf模板引擎的使用

    一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...

  2. SpringBoot基础系列一

    SpringBoot基础知识概览 特性 核心理念:约定优于配置 特点: 1. 开箱即用,根据项目依赖自动配置 2. 功能强大的服务体系,如嵌入式服务.安全 3. 绝无代码生成,不用写.xml配置,用注 ...

  3. SpringBoot基础系列-SpringCache使用

    原创文章,转载请标注出处:<SpringBoot基础系列-SpringCache使用> 一.概述 SpringCache本身是一个缓存体系的抽象实现,并没有具体的缓存能力,要使用Sprin ...

  4. SpringBoot基础系列-使用日志

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996897.html SpringBoot基础系列-使用日志 概述 SpringBoot ...

  5. SpringBoot基础系列-使用Profiles

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996884.html SpringBoot基础系列-使用Profile 概述 Profi ...

  6. SpringBoot基础系列-SpringBoot配置

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9990680.html SpringBoot基础系列-SpringBoot配置 概述 属性 ...

  7. SpringBoot 基础01

    SpringBoot 基础 pom.xml <!-- Spring Boot 依赖版本控制 --> <parent> <groupId>org.springfram ...

  8. springBoot基础2

    主要记录上一篇 springBoot基础 中涉及到的pom.项目结构.注解等 首先是pom: 关于pom中这段插件配置: <plugin> <groupId>org.sprin ...

  9. springBoot基础

    开始之前最基础的东东here 官网:http://projects.spring.io/spring-boot/ 基础快速构建:http://start.spring.io/ 松哥的博客:http:/ ...

  10. 视频作品《springboot基础篇》上线了

    1.场景描述 第一个视频作品出炉了,<springboot基础篇>上线了,有需要的朋友可以直接点击链接观看.(如需购买,请通过本文链接购买) 2. 课程内容 课程地址:https://ed ...

随机推荐

  1. git操作:查看分支、删除本地分支和远程分支

    1.查看本地分支:git branch 2.查看远程分支:git branch -r 或 git branch --remote 3.查看本地和远程的所有分支:git branch -a 4.删除本地 ...

  2. tcbRouter

    tcb-router 基于koa风格的小程序·云开发云函数轻量级类路由库,主要用于优化服务端函数处理逻辑 安装 在云函数当前目录下安装:npm install --save tcb-router  使 ...

  3. javascript 函数表达和闭包

    函数表达式和闭包 针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内.写这个主要是当个笔记加总结 存在的问题请大家多多指正! 定义函数的两种方法 函数声明: function functi ...

  4. React Navigation 导航栏样式调整+底部角标消息提示

    五一佳节匆匆而过,有人选择在外面看人山人海,有人选择宅在家中度过五一,也有人依然坚守在第一线,致敬! 这是坚持学习react-native的第二篇文章,可能会迟到,但是绝不会缺席,这篇要涉及到的是re ...

  5. springboot入门介绍

    1. SpringBoot学习之@SpringBootApplication注解 下面是我们经常见到SpringBoot启动类代码: @SpringBootApplicationpublic clas ...

  6. 利用DNS日志进行MySQL盲注

    0x01 技术原理 这里是利用load_file这个函数利用smb请求方式请求域名机器下的一个文件,由于计算机对该域名不熟悉所以需要优先请求DNS,所以我们通过DNS日志记录中的内容来获取回显.解决了 ...

  7. javascript之BOM对象(三其他对象)

    一.navigator对象 navigator使用来识别浏览器的,是所有支持javascript的浏览器所共有的.与BOM的其他对象不同,每个浏览器的navigator对象都有一套自己的属性. 常见的 ...

  8. Linux常用指定

    学前理论 linux主要特征 :一切且文件(目录.硬盘等都是文件):硬件都在/dev 目录,如硬盘.U盘为/dev/sd[a-d]: /dev/sr0(/dev/cdrom)是光驱的设备名(df命令查 ...

  9. 记录OKR在小公司实施的一次经历

    00 前言 前段时间看了本书叫<OKR工作法>,顺便了解了一下OKR的相关知识,感觉这个起源于英特尔公司的东西,正是为那种小而美的团队准备的好东东.如果你还不知道什么是OKR,那我给你个传 ...

  10. Codeforces Round #605 (Div. 3)

    地址:http://codeforces.com/contest/1272 A. Three Friends 仔细读题能够发现|a-b| + |a-c| + |b-c| = |R-L|*2 (其中L ...