SpringBoot启动时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
@EnableAutoConfiguration
1. 使用AutoConfigurationImportSelector.class给容器导入一些组件
2. getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置
3. private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);这个方法会扫描所有jar包类路径下 META-INF/spring.factories,并把扫描的这些文件的内容包装成Properties对象,从properties中获取到EnableAutoConfiguration.class对应的值,然后把他们添加到容器中
总之一句话,就是将类路径下 META-INF/spring-factories里面配置的所有EnableAutoConfiguration的值加入到容器中
每一个这样的xxAutoConfuguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置
每一个自动配置类做自动配置功能
以HttpEncodingAutoConfiguration为例解释自动配置原理
@Configuration(proxyBeanMethods = false) // 表示这是一个配置类
@EnableConfigurationProperties(ServerProperties.class) // 启动指定类
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) // Spring底层的Conditional注解,根据不同的条件,如果满足条件,整个配置类里面的配置才会生效;这个注解说白了就是判断当前是不是web应用,如果是菜生效
@ConditionalOnClass(CharacterEncodingFilter.class) // 判断当前项目有没有这个类
// CharacterEncodingFilter: springMVC中进行乱码解决的拦截器
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)// 判断配置文件中是否存在某个配置 ,matchIfMissing 表示如果不存在也是成立的
// 说白了,就是说几十配置文件中不配置spring.http.encoding.enabled=true ,也是默认生效的
public class HttpEncodingAutoConfiguration {
@Bean // 给容器中添加组件,这个组件某些值需要从propertis中获取
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
return filter;
}
}
根据当前不同条件判断,决定这个配置类是否生效
一但这个配置类生效;这个类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的
所有配置文件中能配置的属性都是在xxxProperties;配置文件能配置什么就可以参照某个功能对应的这个属性
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) // 从配置文件中获取指定的值和bean的属性进行绑定
public class ServerProperties
精髓:
- springBoot启动会加载大量的自动配置类
- 我们看需要的功能有没有SpringBoot默认写好的自动配置类
- 我们再来看这个配置类中到期配置了哪些组件;
- 给容器自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中执行这些属性的值;
xxxAutoConfiguration:自动配置类;给容器添加组件
xxxProperties:自动配置属性