1 yaml
1.1 yaml介绍
springboot除了兼容properties格式的配置文件还兼容yaml格式的,yaml非常适合做以数据为中心的配置文件
如果springboot的项目中同时有properties和yaml的配置文件,两者都生效,如果其中的内容重复了,以properties优先
1.2 语法
- 使用K: V进行键值映射,V前要有空格作为分隔符
- 区分大小写
- 使用缩进表示层级关系
- 缩进默认不能用Tab键,要用空格。但是实际操作的时候可以使用tab键,不会出现问题
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- 注解使用#字符
- ‘’ “”表示字符串,需要注意的是字符串类型的数据可以不用引号引起来,但是要是使用引号的话,单引号会将转义字符作为字符串进行输出,双引号会将转义字符转义之后输出,比如\n单引号就是\n双引号就是换号符
1.3 数据类型
- 字面量:单个的、不可再分的值。date、boolean、string、number、null
k: v
- 对象:键值对的集合。map、hash、set、object
行内写法: k: {k1:v1,k2:v2,k3:v3}
#或
k:
k1: v1
k2: v2
k3: v3
- 数组:一组按次序排列的值。array、list、queue
行内写法: k: [v1,v2,v3]
#或者
k:
- v1
- v2
- v3
示例如下
person:
name: zhangsan
age: 18
interests: [篮球,游泳]
birth: 2021/12/12
@Data
@ToString
@Component
@ConfigurationProperties("person")
public class Person {
private String name;
private int age;
private String[] interests;
private Date birth;
}
1.3 yaml配置文件提示
在进行yaml配置文件书写时,发现没有自动提示功能,通过在pom.xml中导入配置处理器依赖解决
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
但是该依赖是我们开发中需要,项目开发完打成的jar包中不需要该依赖打入jar包,会降低项目的效率,通过在pom.xml中完成以下配置解决
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
2 Web开发
2.1 静态资源规则与定制化
静态资源是固定页面,包含HTML、CSS、JS、图片等,不需要查数据库也不需要程序处理,直接就能够显示的页面。
只要静态资源放在当前项目的类路径下的static、public 、resources 、META-INF/resources
访问这些静态资源的方式:/(即当前项目根路径) + 静态资源名
原理
当静态资源和controller请求重名的时候,资源解析器会首先去找该名称的Controller看能不能处理。不能处理的请求又交给静态资源处理器默认在类路径下的static、public 、resources 、META-INF/resources查找静态资源,如果静态资源也找不到则响应404页面。
静态资源访问前缀
静态资源访问默认没有前缀,为便于后续拦截器使用方便,可以人为给静态资源添加访问前缀,在yaml中添加下面代码,则之后访问只有使用 /res + 静态资源名,才能访问到相应的静态资源。
spring:
mvc:
static-path-pattern: /res/**
静态资源路径
可以通过在yaml中更改spring. web.resources.static-locations配置项,改变静态资源默认存储路径,进行如下的更改后,访问静态资源的路径为 /res + 静态资源名,请求进来如果在Controller中匹配不到,就去根路径下的hh文件夹下找。
spring:
mvc:
static-path-pattern: /res/**
web:
resources:
static-locations: [classpath:/hh/] #是一个数组,可以写多个地址
2.2 webjars
webjars是将前端所需要的技术的jar包(比如jquery)使用依赖进行导入,webjars的官方文档就是展示jar对应的依赖,使用的时候直接复制到pom.xml文件即可。webjars官网
使用:<script type="text/javascript" th:src="@{/webjars/bootstrap/4.1.0/js/bootstrap.min.js}"></script>
2.3 欢迎页与网页图标
欢迎页
两种方式:
- 在默认或自定义的静态资源路径下写index.html,这里有一个bug,要想让index.html默认被访问,只能配置静态资源路径,但不能配置静态资源的访问前缀。配置静态资源访问前缀会使欢迎页功能失效
- 编写一个controller能处理/index请求
网页图标
在默认或自定义的静态资源路径,只要在下面添加一个命名为favicon.ico的图片,即可将该图片设置成网页的小图标。
配置静态资源访问前缀会使网页图标功能失效
2.4 静态资源配置原理
springboot启动的时候默认加载xxxAutoConfiguration类(自动配置类)
SpringMVC功能的自动配置类是 WebMvcAutoConfiguration
在WebMvcAutoConfiguration自动配置类里的WebMvcAutoConfigurationAdapter静态类上有@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})注解,该注解中的配置类与配置文件中的属性绑定关系如下:WebMvcProperties.class–>spring.mvc 、WebProperties.class -->spring.web
@Configuration(
proxyBeanMethods = false
)
@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {
private static final Log logger = LogFactory.getLog(WebMvcConfigurer.class);
private final Resources resourceProperties;
private final WebMvcProperties mvcProperties;
private final ListableBeanFactory beanFactory;
private final ObjectProvider<HttpMessageConverters> messageConvertersProvider;
private final ObjectProvider<DispatcherServletPath> dispatcherServletPath;
private final ObjectProvider<ServletRegistrationBean<?>> servletRegistrations;
private final WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
private ServletContext servletContext;
//配置类中的有参构造中的参数默认从容器中拿
//ResourceProperties resourceProperties --> 获取和spring.resources绑定的所有的值的对象
//WebMvcProperties mvcProperties --> 获取和spring.mvc绑定的所有的值的对象
//ListableBeanFactory beanFactory --> Spring的beanFactory
//HttpMessageConverters --> 找到所有的HttpMessageConverters
//ResourceHandlerRegistrationCustomizer --> 找到资源处理器的自定义(重点解析)
//DispatcherServletPath --> 找到资源的路径
//ServletRegistrationBean --> 给应用注册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();
}
SpringBoot的规则:配置类的有参构造器所有参数的值都会从容器中拿