一、SpringBoot配置
1. @ConfigurationProperties 与 @Value
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入,注解打在类上 | 一个一个字段绑定,注解打在字段上 |
松散绑定,松散语法user_name->userName | 支持 | 不支持 |
SPEL(#(1+1),true) | 不支持 | 支持 |
JSR303@Validated
|
支持 | 不支持 |
复杂类型封装(map,list) | 支持 | 不支持 |
2. @PropertySource("classpath:person.properties")
因为项目的配置比较多,所以不可能都写在application.yml中,有时需要写在其他配置文件中,如person.properties文件,则在进行属性注入(@ConfigurationProperties
)的时候,需要指定配置文件的路径。
3. @ImportResource(locations="classpath:beans.xml")
在传统的xml_Spring项目中,其他的spring配置文件需要通过<import ...>
导入到applicationContext.xml中才能被spring读取到,而在SpringBoot项目中是通过@ImportResource()注解导入到Spring容器中.
4. 配置文件占位符
- 随机数
${random.value}
,${random.uuid}
- 获取之前配置的值,没有则使用默认值
person.name=${app.name:张三}_dog
5. 配置文件配置与优先级(从高到低,高优先级会覆盖低优先级)
- file:
./config/
- file:
./
- classpath:
/config/
- classpath:
/
6. SpringBoot自动配置原理
- @SpringBootApplication
- EnableAutoConfiguration
- @Import(AutoConfigurationImportSelector.class)
-
selectImports()
->getAutoConfigurationEntry( autoConfigurationMetadata, annotationMetadata)
-
getAutoConfigurationEntry()
->getCandidateConfigurations(annotationMetadata, attributes)
-
getCandidateConfigurations()
->SpringFactoriesLoader.loadFactoryNames( getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())
-
loadFactoryNames()
->loadSpringFactories()
-
loadSpringFactories()
->加载META-INF/spring.factories
文件 - 从配置文件中读取以
EnableAutoConfiguration.class
类路径为key的值,即可以得到springboot的所有自动配置类的路径.
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
- 有了自动配置类路径,接下来加载这些自动配置类,即完成了组件的自动注入(到IOC容器中)
- eg: HttpEncodingAutoConfiguration.class
@Configuration //标识这个一个配置类,可以用来配置Bean
@EnableConfigurationProperties(HttpProperties.class) // 启用HttpProperties.class类的`@ConfigurationProperties(prefix = "spring.http")`注解,将配置文件与配置类进行注入与绑定
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class) //当类路径下存在`CharacterEncodingFilter.class`这个类时
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) //spring.http.encoding.enabled=true是否存在某个配置,如果不存在默认也是生效的
public class HttpEncodingAutoConfiguration {
//上述条件全部成立,则会加载这个配置类下所有配置好的Bean
...
}
- 自动配置类都在
spring-boot-autoconfigure
项目下,类名为XXXXAutoConfiguration,当你的SpringBoot项目添加了相关的依赖,满足了配置类上所有的Condition,那么Spring就会加载这个组件。实现了:使得SpringBoot具有了添加某项依赖就有了可以直接使用某项功能的能力
二、SpringBoot对静态资源的映射规则
- SpringBoot对Web的支持都在
WebMvcAutoConfiguration.class
配置类
- webjars
- webjars: 以jar包的形式引入静态资源,如js,css,jQuery等
- 添加依赖
<dependency> <groupId>org.webjars.bower</groupId> <artifactId>jquery</artifactId> <version>3.4.1</version> </dependency>
- 请求资源,访问
/webjars/jquery/3.4.1/dist/jquery.js
- 自定义的资源
this.resourceProperties.getStaticLocations()
为:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
即,/**
请求任何路径都会到CLASSPATH_RESOURCE_LOCATIONS
下进行资源的查找。
因为WebMvcAutoConfiguration
类已经进行了上述两个配置,所以可以直接进行使用。
三、注册三大组件Servlet
, Filter
, Listener
1. 第一种方式,通过xxxRegistrationBean<>注册
- 通过ServletRegistrationBean<>注册Servlet
- 通过FilterRegistrationBean<>注册Filter
- 通过ServletListenerRegistrationBean<>注册Listener
eg. Servlet
@Bean
public ServletRegistrationBean<AServlet> aServletRegistrationBean() {
return new ServletRegistrationBean<>(new AServlet(), "/aServlet");
}
如DispatcherServlet
就是通过这种方式注册的
2. Servlet 3.0+ 通过注解方式
在Servlet上打注解
@WebServlet
在Filter上打注解
@WebFilter
在Listener上打注解
@WebListener
再通过
@ServletComponentScan
注解开启SpringBoot对三大组件的扫描与自动配置