一、SpringBoot配置
一.@Bean
创建BEAN实例,默认返回Bean为方法名。
@Bean
public RequestInterceptor requestInterceptor()
{
return new FeignRequestInterceptor();
}
二.启动指定profile
1、命令行方式
--spring.profiles.active=dev
2、虚拟机参数
-Dspring.profiles.active=dev
三.加载配置文件顺序
优先级由高到低,优先加载高的。
//项目目录下
-file:/config/
-file:./
//resources目录下
-classpath:/config/
-classpath:/
四.加载外部配置顺序(只写常用的)
- 命令行参数(一般也不用,因为参数比较多)
- java的jar包外部的配置文件(带Spring.profile如:application-dev.properties)
- java的jar包内部的配置文件(带Spring.profile如:application-dev.properties)
- java的jar包外部的配置文件(application-.properties,最常用)
- java的jar包外部的配置文件(application.properties)
五.SpringBoot自动配置原理
1、自动配置原理
SpringBoot启动的时候加载主配置类,开启自动配置功能。@SpringBootApplication注解中的@EnableAutoConfiguration
1.@EnableAutoConfiguration的作用
将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到容器中
//扫描所有jar包下的META-INF/spring.factories,把扫描到的这些文件内容包装成properties文件,从properties文件中获取到
List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);
案例
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
2.以HttpEncodingAutoConfiguration为例解释自动配置原理
@Configuration//配置类,可以给容器添加组件
@EnableConfigurationProperties(HttpProperties.class)//启用指定类的ConfigurationPropertes功能,并和当前类进行绑定
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)//Spring底层@conditional注解,根据不同的条件,判断配置类中的配置是否生效。
@ConditionalOnClass(CharacterEncodingFilter.class)//判断当前项目中有没有这个类
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final HttpProperties.Encoding properties;
//只有一个有参构造器的情况下,参数的值会从容器中拿。---这块还不是很明白
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
@Bean//给容器中添加一个组件,这个组间中某些值需要从properties文件中获取。
@ConditionalOnMissingBean//条件判断
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
...
(1).@EnableConfigurationProperties(HttpProperties.class)启用指定类的ConfigurationPropertes功能
总结:所有在配置文件中能配置的属性都是咋XXXProperties类中封装着
//部分代码
@ConfigurationProperties(prefix = "spring.http")//从配置文件中获取指定的值进行绑定
public class HttpProperties {
/**
* Whether logging of (potentially sensitive) request details at DEBUG and TRACE level
* is allowed.
*/
private boolean logRequestDetails;
/**
* HTTP encoding properties.
*/
private final Encoding encoding = new Encoding();
(2).@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)条件判断
Spring底层@conditional注解,根据不同的条件,判断配置类中的配置是否生效
(3).@ConditionalOnClass(CharacterEncodingFilter.class)条件判断
CharacterEncodingFilter.class是SpringMVC中进行乱码解决的过滤器
(4).@ConditionalOnProperty(prefix = “spring.http.encoding”, value = “enabled”, matchIfMissing = true)条件判断
判断配置文件中是否存在某个配置,此处为spring.http.encoding,如果不存在,判断也是成立的,即即使没有spring.http.encoding也是默认生效的。
2、细节
1.@Conditional派生注解(Spring注解版原生的@Conditional作用)
根据不同的条件判断,决定当前配置类是否生效。
2.扩展
3、怎么看那些配置类是否生效
开启SpringBoot的DEBUG模式,控制台自动打印。