Spring Boot学习笔记总结(三)

文章目录

  • 1. SpringBoot 应该如何编写
  • 2. Lombok常用注解
  • 3. SpringBoot的 dev-tools开发者工具
  • 4. Spring Initializr(Spring 初始化器)
  • 5. yaml
    • 5.1 什么是yaml
    • 5.2 yaml的基本语法
    • 5.3 yaml的使用
    • 5.4 yaml的单双引号
    • 5.5 在Idea中,自己配置的yaml,想要有提示效果(自定义类绑定的配置提示)
  • 6. web场景 静态资源规则与定制化
    • 6.1 官方对静态资源相关的解释目录位置
    • 6.2 静态资源目录
    • 6.3 配置静态访问url的前缀
    • 6.4 支持 WebJars 的使用
  • 7. web场景 欢迎页与favicon功能
    • 7.1 欢迎页
    • 7.2 favicon图标
  • 8. web场景 静态资源的配置原理
    • 8.1 自动配置SpringMVC原理
    • 8.2 SpringMvc资源处理的默认规则
      • 8.2.1 spring.web.resources.add-mappings=false 禁用静态资源规则
      • 8.2.2 spring.web.resources.add-mappings=true(默认) 启动静态资源规则 的一些源码分析
    • 8.3 SpringBoot的欢迎页的处理规则源码

1. SpringBoot 应该如何编写


去官方对应的springboot版本,引入场景依赖,也就是starter场景器。

  • https://spring.io/projects/spring-boot#learn

查看自动配置了哪些内容:

  • 可以在application.properties中,配置debug=true,看起自动配置报告。
  • Negative(否定的,消极的)是不生效的自动配置。
  • Positive(乐观的,积极的)是生效的自动配置。
    Spring Boot学习笔记总结(三)_第1张图片

查看哪些需要修改的配置项:

  • 第一种方式:参考官方的配置项修改。
    Spring Boot学习笔记总结(三)_第2张图片
  • 第二种方式:分析源码,xxxAutoConfiguration类 , xxxProperties类。
    Spring Boot学习笔记总结(三)_第3张图片

按照所需,自定义加入或者替换组件:

  • @Bean,@Component等等

按照所需,自己创建自定义器:

  • 自定义器格式:xxxCustomizer

2. Lombok常用注解


@AllArgsConstructor注解:定义所有参数的构造器。

@NoArgsConstructor注解:无参构造器。

@Data注解:生成get和set方法(在没有@AllArgsConstructor和@NoArgsConstructor默认生成无参构造器。)

@ToString注解:重写toString()方法。

@EqualsAndHashCode注解:重写equals和hashCode方法。

@Slf4j注解:自动给类中注入一个log属性。
Spring Boot学习笔记总结(三)_第4张图片

3. SpringBoot的 dev-tools开发者工具


先去对应版本的官方导入响应的dev-tools开发依赖。
Spring Boot学习笔记总结(三)_第5张图片

dev-tools开发者工具作用:就是重新加载静态或代码文件。

  • 当修改静态文件后ctrl+F9,会帮我们加载上面,不需要重新加载。
  • 当我们修改了代码后,我们只需要ctrl+F9就会重新加载整个程序。

dev-tools是Restart,就是重新启动。


如果想要reload,重新加载(所谓的热部署,热加载)。可以去官方看推荐。
Spring Boot学习笔记总结(三)_第6张图片

4. Spring Initializr(Spring 初始化器)


就是通过idea来创建SpringBoot项目,很方便!

结构如下:
Spring Boot学习笔记总结(三)_第7张图片

5. yaml

5.1 什么是yaml


SpringBoot除了支持application.properties作为配置文件外,还有另一种配置方式yaml。

在这里插入图片描述

yaml非常适合来做以数据为中心的配置文件。

5.2 yaml的基本语法


语法格式:

# key和value之间有冒号和空格。
key: value

大小写敏感。

使用缩进表示层级关系。

  • 缩进不允许使用tab,只允许空格。
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可。

#号,表示注释。

字符串无序加引号,如果要加,‘单引号’ 和 "双引号"表示字符串内容 会被转义/不转义。

写法如下:
Spring Boot学习笔记总结(三)_第8张图片

创建yaml文件的时候,可以使 .yml 或 .yaml末尾。
Spring Boot学习笔记总结(三)_第9张图片

5.3 yaml的使用


创建一个实体类,通过yaml给实体类赋值:

  • 使用@Component和@ConfigurationProperties()注解。
package com.itholmes.boot.boot01helloworld2.bean;

import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Component
@ConfigurationProperties(prefix = "person")
@ToString
@Data
public class Person {
    private String userName;
    private Boolean boss;
    private Date birth;
    private Integer age;
    private String[] interests;
    private List<String> animal;
    private Map<String,Object> score;
    private Set<Double> salarys;
    private Pet pet;
    private Map<String,List<Pet>> allPets;
}

对应上面实体类的一些yaml格式的属性配置:

person:
  userName: zhangsan
  boss: true
  birth: 2019/12/9
  age: 18

# 数组方式一:行内写法
# interests: [篮球,足球]
# 数组方式二:
  interests:
    - 篮球
    - 足球

# list写法和数组写法相同:
  animal: [阿猫,阿狗]

#  map类型的写法方式一:
#  score:
#    english: 80
#    math: 90
  score: {english:80,math:90} # 这里就不需要写 ": " 因为是json形式。

#  set写法和数组写法也是相同的
  salarys:
    - 9999.98
    - 9999999

# 对于引用对象类型的属性设置,缩进就可以了。
  pet:
    name: 阿狗
    weight: 99.99

#  Map> allPets; 对于这种复杂变量类型的。
  allPets:
    sick:
      - {name: 阿狗,weight: 99.99}
      - name: 阿猫
        weight: 88.88
      - name: 阿六
        weight: 77.77
    health: [{name: 阿狗,weight: 99.99},{name: 阿狗,weight: 99.99}]


# 以后配置文件,通过yaml也是很方便的。
#spring:
#  banner:
#    charset:
#  cache:
#    cache-names:

5.4 yaml的单双引号


无论单引号还是双引号,都是表示字符串的。但是也有不同点!

  • 那就是双引号不会自动将转义字符进行转义, 单引号会将转义字符转义成为普通字符串!
  • 转义字符就是 " / " 。像/n,本来就是换行的意思,一旦写成//n那就不是换行了就是普通的字符串 " /n "。
  • 单引号效果:
    Spring Boot学习笔记总结(三)_第10张图片
  • 双引号效果:
    Spring Boot学习笔记总结(三)_第11张图片

5.5 在Idea中,自己配置的yaml,想要有提示效果(自定义类绑定的配置提示)


在Idea中,自己配置的yaml,想要有提示效果,可以添加一个标注处理器( Configuring the Annotation Processor,英文直译就是配置标注处理器,不要一直以为是注解。) , 见下图:
Spring Boot学习笔记总结(三)_第12张图片

先打开官方对应SpringBoot版本的参考文档:
Spring Boot学习笔记总结(三)_第13张图片

找到Configuration the Annotation Processor:
Spring Boot学习笔记总结(三)_第14张图片

按照官方要求,导入对应的configuration-processor依赖:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-configuration-processorartifactId>
    <optional>trueoptional>
dependency>

之后,就不会变红了,提示你重新启动一下SpringBoot。
Spring Boot学习笔记总结(三)_第15张图片

Spring Boot学习笔记总结(三)_第16张图片


此外,因为这个spring-boot-configuration-processor包,是为了方便我们开发人员使用的,所以打包,发布的时候,就不要再加上!没必要添加没用的jar包。
Spring Boot学习笔记总结(三)_第17张图片

6. web场景 静态资源规则与定制化

6.1 官方对静态资源相关的解释目录位置


官方文档关于web场景的内容如下图:
Spring Boot学习笔记总结(三)_第18张图片


官方静态资源的章节,如下图:
Spring Boot学习笔记总结(三)_第19张图片

6.2 静态资源目录


官方的原话是/static (or /public or /resources or /META-INF/resources) in the classpath or from the root of the ServletContext.

**默认静态资源的存放位置是类路径下:有/static (or /public or /resources or /META-INF/resources) **
Spring Boot学习笔记总结(三)_第20张图片


后台也可以自定义静态资源配置目录:

spring:
  mvc:
    # 配置静态访问url的前缀。
    static-path-pattern: /res/**

  web:
    resources:
      # 配置后台静态资源路径位置。
      static-locations: classpath:/haha/

这样,我们就只能在/haha这个目录下面查找静态资源了。
Spring Boot学习笔记总结(三)_第21张图片
Spring Boot学习笔记总结(三)_第22张图片


如果controller映射的路径和静态资源的名字重名的话,是怎样?
Spring Boot学习笔记总结(三)_第23张图片

流程如下:

  • 请求进来,先去找Controller看能不能处理,能不能映射到mapping;不能处理的所有请求又都交给静态资源处理器处理,如果静态资源也找不到对应路径内容,那么就是返回404。

6.3 配置静态访问url的前缀


静态映射的默认路径是: " /** "。表示当前下的所有包下的资源路径。并且没有前缀。

默认静态资源是无前缀的:
Spring Boot学习笔记总结(三)_第24张图片


而我们配置前缀url的目的是,方便我们的拦截器或者过滤器的一些操作,如下:

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

这样,我们想要请求静态资源,必须携带/res的前缀路径。
Spring Boot学习笔记总结(三)_第25张图片

6.4 支持 WebJars 的使用


WebJars官方

WebJars就是将前端的一些js,css等等文件,也全都做成了依赖。

如果是maven,同样也就可以直接在pom上面导入依赖就可以了。

Spring Boot学习笔记总结(三)_第26张图片
Spring Boot学习笔记总结(三)_第27张图片

使用引入的js路径,因为该包里面也有META-INF/resources,对应了默认的静态资源引入路径:
Spring Boot学习笔记总结(三)_第28张图片
Spring Boot学习笔记总结(三)_第29张图片

7. web场景 欢迎页与favicon功能

7.1 欢迎页


官方给出两种欢迎页的方式:
Spring Boot学习笔记总结(三)_第30张图片


静态资源路径下,index.html页面:

  • 可以配置静态资源路径。
  • 但是不可以配置静态资源的访问前缀,否则导致index.html不能被默认访问。这算是一个小bug点。
spring:
  mvc:
    # 不能配置,会影响index.html的默认访问。
    static-path-pattern: /res/**

7.2 favicon图标


只需要将favicon.ico图片放到,静态资源规定的路径下就可以了。
Spring Boot学习笔记总结(三)_第31张图片

同样favicon.ico也是会被静态资源访问前缀影响!

spring:
  mvc:
    # 不能配置,也会影响到favicon.ico的配置。
    static-path-pattern: /res/**

8. web场景 静态资源的配置原理

8.1 自动配置SpringMVC原理


SpringBoot启动默认加载一些列的xxxAutoConfiguration自动配置类。

其中SpringMVC功能的自动配置类,对应WebMvcAutoConfiguration。
Spring Boot学习笔记总结(三)_第32张图片
Spring Boot学习笔记总结(三)_第33张图片
对应的有参构造器所有参数的值都会从容器中确定:

//webProperties获取和spring.web绑定的所有值的对象,在构造器里面它会把配置信息给到resourceProperties变量中。
//mvcProperties获取和spring.mvc绑定的所有值的对象。
//ListableBeanFactory beanFactory是Spring的bean工厂
//HttpmessageConverters找到所有的HttpmessageConverters
//resourceHandlerRegistrationCustomizerProvider找到资源处理器的自定义器。
//dispatcherServletPath是dispatcherServlet的路径。
//servletRegistrations给应用注册Servlet,Filter等
public WebMvcAutoConfigurationAdapter(
		WebProperties webProperties, 
		WebMvcProperties mvcProperties, 
		ListableBeanFactory beanFactory, 
		ObjectProvider<HttpMessageConverters> messageConvertersProvider, 
		ObjectProvider<WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider, 
		ObjectProvider<DispatcherServletPath> dispatcherServletPath, 
		ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) 
{
     this.resourceProperties = webProperties.getResources();
     this.mvcProperties = mvcProperties;
     this.beanFactory = beanFactory;
     this.messageConvertersProvider = messageConvertersProvider;
     this.resourceHandlerRegistrationCustomizer = (WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer)resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
     this.dispatcherServletPath = dispatcherServletPath;
     this.servletRegistrations = servletRegistrations;
     this.mvcProperties.checkConfiguration();
 }

8.2 SpringMvc资源处理的默认规则

8.2.1 spring.web.resources.add-mappings=false 禁用静态资源规则


在WebMvcAutoConfiguration类中,有一个addResourceHandlers方法,对于静态资源自动处理都是经过该方法。

  • !this.resourceProperties.isAddMappings()是判断是否禁用静态资源规则。
public void addResourceHandlers(ResourceHandlerRegistry registry) {
     if (!this.resourceProperties.isAddMappings()) {
         logger.debug("Default resource handling disabled");
     } else {
         this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
         this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
             registration.addResourceLocations(this.resourceProperties.getStaticLocations());
             if (this.servletContext != null) {
                 ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
                 registration.addResourceLocations(new Resource[]{resource});
             }

         });
     }
 }

注意前面有一个取反操作: !this.resourceProperties.isAddMappings() ,我们进入该方法所在的源码查看。
Spring Boot学习笔记总结(三)_第34张图片
也就是当我们设置spring.web.resources.add-mappings为false(这里用的yaml形式。),就会禁用了静态资源规则。

spring:
  web:
    resources:
      add-mappings: true # 表示静态资源会被禁用掉!

Spring Boot学习笔记总结(三)_第35张图片

8.2.2 spring.web.resources.add-mappings=true(默认) 启动静态资源规则 的一些源码分析


Spring Boot学习笔记总结(三)_第36张图片
对应缓存设置时间的源码分析:
Spring Boot学习笔记总结(三)_第37张图片
Spring Boot学习笔记总结(三)_第38张图片


对于能够默认访问webjars静态资源的源码分析原因:
Spring Boot学习笔记总结(三)_第39张图片


配置访问静态资源url前缀的源码分析:
Spring Boot学习笔记总结(三)_第40张图片


spring.web.resources.static-locations,配置后台静态资源存储访问路径的源码分析:
Spring Boot学习笔记总结(三)_第41张图片

8.3 SpringBoot的欢迎页的处理规则源码


也是在WebMvcAutoConfiguration类中静态类里面的welcomePageHandlerMapping方法:

//在SpringMvc中有一个HandlerMapping:处理器映射。保存了每一个Handler能处理那些请求。

@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
	//这里有一个WelcomePageHandlerMapping对象,给他传入了很多参数,其中就包括this.mvcProperties.getStaticPathPattern()参数。
    WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
    welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
    welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
    return welcomePageHandlerMapping;
}

进入WelcomePageHandlerMapping对象构造方法源码分析:

  • 通过源码来看,也解释了为什么自定义设置了staticPathPattern(请求资源路径前缀),就不能默认访问index.html页面了。
  • 并且默认还是走方式二的template的index的handler路径(controller路径)。
WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders, ApplicationContext applicationContext, Resource welcomePage, String staticPathPattern) {
	//welcomePage欢迎页存在 ,并且staticPathPattern路径是"/**"就可以走方式一(static静态欢迎页):index.html路径。
    if (welcomePage != null && "/**".equals(staticPathPattern)) {
        logger.info("Adding welcome page: " + welcomePage);
        this.setRootViewName("forward:index.html");
    } else if (this.welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
    	//调用Controller(handler) /index
        logger.info("Adding welcome page template: index");
        this.setRootViewName("index");
    }
}

你可能感兴趣的:(Java(从头到尾,笔记),spring,boot,学习,java)