SpringBoot2

1.SpringBoot特点

1.1.依赖管理

(1)父项目做依赖管理

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
    </parent>

(2)开发导入starter场景启动器
引入spring-boot-starter-*,*为场景,则该场景的所有依赖都被自动引入
SpringBoot所支持的场景可见 SpringBoot官方starter
也可以自己创建starter,且第三方的starter起名应该按照如下的要求*-spring-boot-starter*为第三方项目名称)


所有场景最基本的启动器就是spring-boot-starter
(3)无需关注版本号,自动版本仲裁
引入依赖默认都可以不写版本号,但是所引入的非版本仲裁的jar,一定要写版本号
(4)可以修改版本号(如修改mysql-connector版本号,在本项目的pom中直接填写<properties><mysql.version>5.1.43</mysql-version></properties>,对应内容名称可以点进spring-boot-starter-parent的上一级查看)

1.2.自动配置

(1)引入webstater可以自动配好SpringMVC

  • 引入SpringMVC全套组件
  • 自动配好SpringMVC常用组件(功能)
    (2)自动配好Web常见功能,如:字符编码问题
  • SpringBoot帮助配置好所有Web开发的常见场景
    (3)默认包结构
  • 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
  • 无需以前的包扫描配置
  • 想要改变扫描路径,可以通过以下两种方法:
    • 1).@SpringBootApplication(scanBasePackages = "com")
    • 2).@ComponentScan(basePackages = "com"),但是注意此法与@SpringBootApplication@ComponentScan冲突,因此要去掉@SpringBootApplication注解,并将其内部注解放在启动类上方,即:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

2.开发技巧

2.1.LomBok

首先需要引入依赖:

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

其次在idea中引入Lombok插件
之后可以在类上标记@Slf4j,并使用日志类

@Slf4j
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String handle01() {
        log.info("123");
        return "Hello Spring!I will be the NO.1!";
    }
}

2.2.dev-tools

引入:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

之后修改完代码时重新编译即可,ctrl+F9,即可进行重启项目
如果使用热更新:使用JRebel(付费)

2.3.配置yml自动提示

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

此依赖要在生产环境下排除:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
  <proc>none</proc>
  </configuration>
</plugin>

3.SpringMVC自动配置原理

SpringMVC官方文档

3.1.静态资源访问

(1)静态资源目录
类路径下的/static (or /public or /resources or /META-INF/resources)
访问:当前项目根路径+项目资源名
原理:静态映射为/**
请求进来,先去找Controller看能不能处理,不能处理的所有请求交给静态资源处理器
静态资源去静态资源目录中查找,如果找不到,则返回404
(2)静态资源访问前缀
也可以设置静态资源访问路径:

spring:
  mvc:
    static-path-pattern: /resource/**

(3)改变静态资源位置

spring:
  web:
    resources:
      static-locations: classpath:/res

补充:webjars官方地址,此网站将jquery等导成maven依赖等

可以通过/webjars/**的方式访问对应webjars资源
可以通过http://localhost:8080/webjars/jquery/1.12.0/jquery.js访问上面的jquery文件
(4)欢迎页

  • 方式一:静态资源路径下添加index.html
    此种情况下可以配置静态资源路径,但是不能配置静态资源访问前缀,否则导致index.html不能被默认访问
  • 方式二:借助Controller拦截/index请求
    (5)小图标
    在静态文件夹中防止favicon.ico文件可以设置小图标,注意设置静态资源访问前缀也会影响图标的显示
    因为浏览器直接发送/favicon.ico请求,如果更改静态文件访问路径,则无法获取到图标

3.2.静态资源配置原理

SpringBoot启动默认加载xxxAutoConfiguration配置类(自动配置类)
SpringMVC功能的自动配置类:WebMvcAutoConfiguration




配置文件相关属性和xxx进行绑定,WebMvcProperties==spring.mvc
一个配置类如果只有一个有参构造器,有参构造器中所有参数的值都会从容器中确定


设置spring.WEB.isAddMapping为false,则会使默认静态访问失效,即禁用所有静态资源规则
欢迎页的处理规则:

handlerMapping是处理器映射,保存每一个handler能处理哪些请求

3.3.请求参数处理

使用REST风格可以使用_method来设置请求方式(form表单只支持GET与POST两种提交方式,在提交PUT与DELETE时注意要以post方式提交)
同时要设置enabled为true

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true




如:

测试REST风格
<form action="/user" method="get">
    <input value="REST-GET提交" type="submit">
</form>
<form action="/user" method="post">
    <input value="REST-POST提交" type="submit">
</form>
<form action="/user" method="post">
    <input name="_method" type="hidden" value="PUT">
    <input value="REST-PUT提交" type="submit">
</form>
<form action="/user" method="get">
    <input name="_method" type="hidden" value="DELETE">
    <input value="REST-DELETE提交" type="submit">
</form>

REST原理:

  • 表单提交会带上_method
  • 请求过来会被Filter(OrderedHiddenHttpMethodFilter)拦截,兼容以下请求:PUT DELETE PUTCH
    • 原生request,包装模式requestWrapper重写getMethod方法,返回的是传入的值
    • 过滤器链放行时用wrapper,以后的方法调用getMethod是调用requestWrapper的
      注意仅限于表单提交,对于如Postman等方式提交的,本身已经支持PUT等,就无需Filter(即不必设置enabled为true)
posted @ 2021-08-06 18:41  kanaliya  阅读(151)  评论(0)    收藏  举报