springboot自动配置的原理
加载主配置类,开启自动配置功能@EnableAutoConfiguraion
利用
AutoConfigurationImportSelector
给容器导入一些组件。
获取所有候选的配置
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
getCandidateConfigurations这个方法内部
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
SpringFactoriesLoader.loadFactoryNames
扫描所有jar包下的META-INF/spring.factoryies ,把扫描到的这些文件内容包装成properties对象
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
从properties中获取到EnableAutoConfiguraion.class类(类名对应的值),然后添加到容器中
以这个配置类做解释
#表明这个类是一个配置类
@Configuration(proxyBeanMethods = false):
¥开启ConfigurationProperties注解将ServerProperties类中的属性和配置文件中的值进行绑定
@EnableConfigurationProperties(ServerProperties.class)
#根据不同的条件进行判断,如果满足条件才会生效 ,@Conditionalspring底层注解,根据不同的条件,如果满足指定的条件,整个配制类中的配置就会生效.
#判断当前是否是web应用,如果是,当前配置类生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
#判断当前项目有没有这个类 CharacterEncodingFilter springmvc解决乱码的过滤器
@ConditionalOnClass(CharacterEncodingFilter.class)
#判断配置文件中是否存在某个配置 server.servlet.encoding.enabled是否存在,如果不存在,判断也是成立的。
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)