SpringBoot核心功能,配置文件、Web开发、单元测试

SpringBoot核心功能,配置文件、Web开发、单元测试,第1张

SpringBoot核心功能,配置文件、Web开发、单元测试

文章目录
  • 一、配置文件
    • 1. properties文件
    • 2. yaml文件
      • 2.1 简介
      • 2.2 基本语法
      • 2.3 数据类型
  • 二、Web开发
    • 1. 简单功能
      • 1.1 静态资源访问
      • 1.2 欢迎页和Favicon
      • 1.3 静态资源配置原理
    • 2. 请求参数处理
      • 2.1 常用注解
    • 3. 响应数据
      • 3.1 响应JSON
    • 4. 拦截器
    • 6. 文件上传
    • 7. 异常处理
  • 三、数据访问
    • 1. SQL
      • 1.1 配置数据源
    • 2. NoSQL
  • 四、单元测试
  • 五、其他特性
    • 1. 环境切换

一、配置文件 1. properties文件

properties文件的用法比较熟悉,这里就不过多介绍

2. yaml文件 2.1 简介
  • YAML是“YAML Ain`t Markup Language”(是一种标记语言)的递归缩写。
  • 适合用来做以数据为中心的配置文件
2.2 基本语法
  • key: value;k v之间有一个空格
  • 大小写敏感
  • 使用缩进进行层级关系
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • # 表示注释
2.3 数据类型
  1. 字面量:当个、不可分的值。date、Boolean、String、number、null

    K: v
    
  2. 对象:键值对的集合。map、hash、set、Object

    # 行内写法
    k: {k1:v1,k2:v2,k3:v3}
    k: 
      k1: v1
      k2: v2
      k3: v3
    
  3. 数组:一组按次序排列的值。array、list、queue

    # 行内写法
    k: [v1,v2,v3]
    k:
      - v1
      - v2
      - v3
    
二、Web开发 1. 简单功能 1.1 静态资源访问
  1. 类路径下:called:/static(or /publicor /resourcesor /meta-INF/resources)

  2. 静态资源放到以上目录下,可以通过根目录加静态资源名的方式直接访问

  3. 静态资源会映射 public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object loginUser = session.getAttribute("loginUser"); //返回true表示放行 if (!Objects.isNull(loginUser)) { return true; } request.setAttribute("msg", "请先登录"); request.getRequestDispatcher("/").forward(request, response); return false; } @Override //目标方法执行之后 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } @Override //页面渲染之后 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } } //配置拦截器 @Configuration public class AdminWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) //拦截的路径 .addPathPatterns(" @PostMapping(value = "/upload") public Map upload(@RequestParam("email") String email, @RequestParam("username") String username, @RequestParam("image") MultipartFile image, @RequestParam("photos") MultipartFile[] photos) throws IOException { log.info("上传的数据:email={},username={},image={},photos={}", email, username, image.getSize(), photos.length); if (!image.isEmpty()) { String originalFilename = image.getOriginalFilename(); image.transferTo(new File("F:\test\" + originalFilename)); } if (photos.length > 0) { for (MultipartFile photo : photos) { if (!photo.isEmpty()) { String originalFilename = photo.getOriginalFilename(); photo.transferTo(new File("F:\test\" + originalFilename)); } } } HashMap res = new HashMap<>(); res.put("msg", "ok"); res.put("code", "200"); return res; } }

    1. 配置文件

      spring:
        servlet:
          multipart:
            # 文件上传的大小
            max-file-size: 10MB
            # 整体文件上传的大小
            max-request-size: 100MB
      
    7. 异常处理
    1. 定义基础接口

      public interface baseErrorInfoInterface {
      
          
          String getResultCode();
      
          
          String getMsg();
      }
      
    2. 定义异常枚举类

      public enum ExceptionEnum implements baseErrorInfoInterface {
      
          SUCCESS("200", "成功"),
      
          NOT_FOUND("404", "未找资源"),
      
          SERVER_ERROR("500", "服务器内部异常");
      
          
          private final String code;
      
          
          private final String msg;
      
          ExceptionEnum(String code, String msg) {
              this.code = code;
              this.msg = msg;
          }
      
          @Override
          public String getResultCode() {
              return code;
          }
      
          @Override
          public String getMsg() {
              return msg;
          }
      }
      
    3. 自定义异常

      @Data
      public class MyDefinedException extends RuntimeException {
      
          private static final long serialVersionUID = 2L;
      
          protected String errorCode;
      
          protected String errorMsg;
      
          public MyDefinedException() {
              super();
          }
      
          public MyDefinedException(baseErrorInfoInterface baseErrorInfoInterface) {
              super(baseErrorInfoInterface.getResultCode());
              this.errorCode = baseErrorInfoInterface.getResultCode();
              this.errorMsg = baseErrorInfoInterface.getMsg();
          }
      
          public MyDefinedException(baseErrorInfoInterface errorInfoInterface, Throwable cause) {
              super(errorInfoInterface.getResultCode(), cause);
              this.errorCode = errorInfoInterface.getResultCode();
              this.errorMsg = errorInfoInterface.getMsg();
          }
      
          public MyDefinedException(String errorMsg) {
              super(errorMsg);
              this.errorMsg = errorMsg;
          }
      
          public MyDefinedException(String errorCode, String errorMsg) {
              super(errorCode);
              this.errorCode = errorCode;
              this.errorMsg = errorMsg;
          }
      
          public MyDefinedException(String errorCode, String errorMsg, Throwable cause) {
              super(errorCode, cause);
              this.errorCode = errorCode;
              this.errorMsg = errorMsg;
          }
      
          @Override
          public Throwable fillInStackTrace() {
              return this;
          }
      }
      
    4. 自定义数据传输类

      @Getter
      @Setter
      public class ResultResponse {
      
          private String code;
      
          private String msg;
      
          private Object result;
      
          public ResultResponse() {
          }
      
          public ResultResponse(baseErrorInfoInterface errorInfoInterface) {
              this.code = errorInfoInterface.getResultCode();
              this.msg = errorInfoInterface.getMsg();
          }
      
          public static ResultResponse success() {
              return success(null);
          }
      
          public static ResultResponse success(Object data) {
              ResultResponse res = new ResultResponse();
              res.setCode(ExceptionEnum.SUCCESS.getResultCode());
              res.setMsg(ExceptionEnum.SUCCESS.getMsg());
              res.setResult(data);
              return res;
          }
      
          public static ResultResponse error(baseErrorInfoInterface errorInfo) {
              ResultResponse res = new ResultResponse();
              res.setMsg(errorInfo.getMsg());
              res.setCode(errorInfo.getResultCode());
              res.setResult(null);
              return res;
          }
      
          public static ResultResponse error(String code, String msg) {
              ResultResponse res = new ResultResponse();
              res.setCode(code);
              res.setMsg(msg);
              res.setResult(null);
              return res;
          }
      
          @Override
          public String toString() {
              return JSON.toJSONString(this);
          }
      }
      
    5. 全局异常处理

      @ControllerAdvice
      @Slf4j
      public class GlobalExceptionHandler {
      
          
          @ExceptionHandler(value = MyDefinedException.class)
          @ResponseBody
          public ResultResponse myDefinedExceptionHandler(HttpServletRequest request, MyDefinedException e) {
              log.error("业务异常:{}", e.getErrorMsg());
              return ResultResponse.error(e.getErrorCode(), e.getErrorMsg());
          }
      
          
          @ExceptionHandler(value = NullPointerException.class)
          @ResponseBody
          public ResultResponse exceptionHandler(HttpServletRequest req, NullPointerException e) {
              log.error("空指针异常:{}", e.getMessage());
              return ResultResponse.error("501", "空指针异常");
          }
      
          
          @ExceptionHandler(value = Exception.class)
          @ResponseBody
          public ResultResponse exceptionHandler(HttpServletRequest req, Exception e) {
              log.error("服务器内部异常:{}", e.getMessage());
              return ResultResponse.error(ExceptionEnum.SERVER_ERROR);
          }
      }
      
    三、数据访问 1. SQL 1.1 配置数据源
    1. 导入jdbc场景

      
          org.springframework.boot
          spring-boot-starter-data-jdbc
      
      
    2. 导入数据库驱动

      
          mysql
          mysql-connector-java
          8.0.26
      
      
    3. 修改配置项

        datasource:
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/db_test
          username: root
          password: xxxxxx
      
    2. NoSQL
    1. 引入依赖

      
          org.springframework.boot
          spring-boot-starter-data-redis
      
      
    2. 配置

      spring:
        redis:
          host: xxx
          port: 6379
          password: xxxxx
          client-type: jedis
      
    四、单元测试
    1. 引入依赖

      
          org.springframework.boot
          spring-boot-starter-test
          test
      
      
    2. 常用注解

      • @Test:表示方法是测试方法。与JUnit 4的@Test注释不同,这个注释不声明任何属性,因为JUnit Jupiter中的测试扩展基于它们自己的专用注释进行 *** 作。
      • @ParameterizedTest:表示方法是参数化测试。
      • @RepeatedTest:表示方法是重复测试的测试模板
      • @TestFactory:表示方法是动态测试的测试工厂。
      • @TestInstance:用于为带注释的测试类配置测试实例生命周期。
      • @TestTemplate:表示方法是为测试用例设计的模板,根据注册提供程序返回的调用上下文的数量进行多次调用。
      • @DisplayName:声明测试类或测试方法的自定义显示名称。
      • @BeforeEach:表示在当前类中每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之前执行注释的方法;类似于JUnit 4的@Before。
      • @AfterEach:表示在当前类中的每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之后,都应该执行带注释的方法;类似于JUnit 4的@After。
      • @BeforeAll:表示应在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法之前执行带注释的方法;类似于JUnit 4的@BeforeClass。
      • @AfterAll:表示在当前类中,所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法都应该执行注释的方法;类似于JUnit 4的@AfterClass。
      • @Nested:表示带注释的类是一个嵌套的、非静态的测试类。@BeforeAll和@AfterAll方法不能直接在 @Nested 测试类中使用,除非使用“每个类”测试实例生命周期。
      • @Tag:用于在类或方法级别声明过滤测试的标记;类似于TestNG中的测试组或JUnit 4中的类别。
      • @Disabled:用于禁用测试类或测试方法;类似于JUnit 4的@Ignore。
      • @ExtendWith:用于注册自定义扩展。
    五、其他特性 1. 环境切换
    1. application-profile功能

      1. 默认配置文件:application.yaml;任何时候都会加载
      2. 指定环境配置文件 application-{env}.yaml
      3. 激活指定环境
        1. 配置文件激活
        2. 命令行激活
      4. 默认配置和环境配置同时生效
      5. 同名配置项,profile配置优先
    2. 配置

      • application.yaml文件
      spring:  
        profiles:
          # 指定激活的环境
          active: prod
      
      • application-prod.yaml文件
      # 配置端口号
      server:
        port: 8080
      
    3. 通过命令行切换环境

      java -jar [项目名称] --spring.profiles.active=[环境]
      

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zaji/3976198.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-21
下一篇 2022-10-21

发表评论

登录后才能评论

评论列表(0条)

保存