1自动配置类
前面SpringBoot启动的主入口注解SpringBootApplication分析有讲到自动配置了,下面是更细的说明
步骤
- 加载所有的配置类
- 读取这个配置类的条件,判断是否生效,如果生效,加载配置了bean方法添加的组件,这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
1
具体的配置类如下
2 HttpEncodingAutoConfiguration解释自动配置原理
*/
@Configuration //表示这是个配置类,会把bean标志的方法返回的bean注入到容器中
@EnableConfigurationProperties(HttpEncodingProperties.class)//将指定类加载到容器中,实现指定类与配置文件一一映射如果满足指定的条件,整个配置类里面的配置就会生效,判断当前应用是否是web应用,如果是,当前配置类(HttpEncodingAutoConfiguration)生效(注意:下面还有2个条件)
@ConditionalOnWebApplication
同理
@ConditionalOnClass(CharacterEncodingFilter.class)、
//判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,默认返回ture
//换句话说:即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {private final HttpEncodingProperties properties;
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
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;
}
上面代码@EnableConfigurationProperties(HttpEncodingProperties.class)
3@Conditional派生注解
- @ConditionalOnJava 系统的java版本是否符合要求
- @ConditionalOnBean 容器中存在指定Bean;
- @ConditionalOnMissingBean 容器中不存在指定Bean;
- @ConditionalOnExpression 满足SpEL表达式指定
- @ConditionalOnClass 系统中有指定的类
- @ConditionalOnMissingClass 系统中没有指定的类
- @ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
- @ConditionalOnProperty 系统中指定的属性是否有指定的值
- @ConditionalOnResource 类路径下是否存在指定资源文件
- @ConditionalOnWebApplication 当前是web环境
- @ConditionalOnNotWebApplication 当前不是web环境
- @ConditionalOnJndi JNDI 存在指定项
4判断自动配置类是否生效
- Positive matches:(启用自动配置类)
- Negative matches:(没有启动的自动配置类)