SpringBoot自动配置
自动配置原理:
1.Springboot启动加载主配置类,开启自动配置功能的注解
@EnableAutoConfiguration
2.@EnableAutoConfiguration作用:
利用AutoConfigurationImportSelector向容器中导入组件
↓点击 21行
//利用AutoConfigurationImportSelector中的这个方法导入组件
String[] selectImports(AnnotationMetadata annotationMetadata)
↓下面77行
//获取候选配置,放在集合里面
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
↓点击110行
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
↓点击
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
//urls 方法会扫描所以jar包类路径下"META-INF/spring.factories" 将扫描到的文件内容包装成properties 对象 然后重properties 对象中获取到类名对应的值,再添加到容器中,从而实现了自动配置
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
自动配置的路径在 Maven管理的 spring-boot-autoconfigure-2.2.6.RELEASE.jar下的META-INF/spring.factories
以HttpEncodingAutoConfiguration举例:
@Configuration(
proxyBeanMethods = false
)//表示这是一个配置类,给容器加载组件
@EnableConfigurationProperties({HttpProperties.class})//开启EnableConfigurationProperties功能
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
@ConfigurationProperties(//将配置文件中配置的属性的值,映射到当前组件中
prefix = "spring.http"
)
总结:
1.springboot启动加载大量自动配置类,通过在properties配置文件中启动debug=true查看那些自动配置启动了那些没启动
2.我们需要的功能有没有默认写好的自动配置类,如果有我们就不需要自己再去写。
3.我们可以看自动配置类到底配置了那些组件,如果有我们就不需要配置。
4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定属性的值