springboot学习(五)自动配置原理及@Conditional派生注解

一.自动配置原理
1.SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration
springboot学习(五)自动配置原理及@Conditional派生注解_第1张图片
分析源码发现
springboot学习(五)自动配置原理及@Conditional派生注解_第2张图片
2.@EnableAutoConfiguration 作用:
利用AutoConfigurationImportSelector给容器中导入一些组件
springboot学习(五)自动配置原理及@Conditional派生注解_第3张图片
可以查看AutoConfigurationImportSelector.java里的selectImports()方法的内容得知获取了哪些组件;

springboot学习(五)自动配置原理及@Conditional派生注解_第4张图片
扫描jar包列路径下的 META-INF/spring.factories,把扫描到的这些文件包装成properties对象,从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加到容器中
springboot学习(五)自动配置原理及@Conditional派生注解_第5张图片

将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中;

每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;

springboot学习(五)自动配置原理及@Conditional派生注解_第6张图片

@Configuration 代表一个配置文件
@EnableConfigurationProperties(HttpProperties.class) 启动配置文件的配置类

如果想要当前配置文件生效,必须有servlet的运行环境
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)

如果想要当前配置文件生效,必须有CharacterEncodingFilter这个类
@ConditionalOnClass(CharacterEncodingFilter.class)

如果配置了spring.http.encoding为false当条件不成立,配置不生效 默认为true
@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
@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;
}

3.总结:

  • SpringBoot启动会加载大量的自动配置类
  • 我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
  • 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
  • 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可
    以在配置文件中指定这些属性的值;
    • xxxxAutoConfigurartion:自动配置类;给容器中添加组件
    • xxxxProperties:封装配置文件中的默认配置

二.@Conditional派生注解关属性;

@ConditionalOnJava 系统的java版本是否符合要求
@ConditionalOnBean 容器中存在指定Bean;
@ConditionalOnMissingBean 容器中不存在指定Bean;
@ConditionalOnExpression 满足SpEL表达式指定
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定资源文件
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
@ConditionalOnJndi JNDI存在指定项

可以使用debug:true看哪些配置文件生效,哪些没生效

你可能感兴趣的:(springboot)