springboot除了兼容properties格式的配置文件还兼容yaml格式的,yaml非常适合做以数据为中心的配置文件
如果springboot的项目中同时有properties和yaml的配置文件,两者都生效,如果其中的内容重复了,以properties优先
k: v
行内写法: k: {k1:v1,k2:v2,k3:v3}
#或
k:
k1: v1
k2: v2
k3: v3
行内写法: 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;
}
在进行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>
静态资源是固定页面,包含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/] #是一个数组,可以写多个地址
webjars是将前端所需要的技术的jar包(比如jquery)使用依赖进行导入,webjars的官方文档就是展示jar对应的依赖,使用的时候直接复制到pom.xml文件即可。webjars官网
使用:<script type="text/javascript" th:src="@{/webjars/bootstrap/4.1.0/js/bootstrap.min.js}"></script>
欢迎页
两种方式:
网页图标
在默认或自定义的静态资源路径,只要在下面添加一个命名为favicon.ico的图片,即可将该图片设置成网页的小图标。
配置静态资源访问前缀会使网页图标功能失效
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的规则:配置类的有参构造器所有参数的值都会从容器中拿