首页 > 技术文章 > SpringBoot自动配置

wangjing1997 2021-07-15 13:49 原文

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),

@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public

@interface SpringBootApplication{

}

 

 

======================

 

@SpringBootApplication
public class mainApplication {
public static void main(String[] args) {
SpringApplication.run(mainApplication.class,args);
}
}
1。
@SpringBootApplication
    mainAPPlication是一个配置类
2.ComponentScan
    指定扫描文件,其中有两个自定义扫描器
3.@EnableAutoConfiguration
  3.1@AutoConfigurationPackage
     自动配置包
      @Import(AutoConfigurationPackages.Registrar.class)
         //给容器中导入一系列组件
      public @interface AutoConfigurationPackage {}
        Registrar中
          1.
registerBeanDefinitions//将指定包下的所有组件导入容器中
              位置@SpringBootApplication在
mainApplication中所以找的是主程序  
        3.2@Import(AutoConfigurationImportSelector.class)
          利用getAutoConfigurationEntry(annotationMetadata);这个方法给容器中批量导入一些组件{
        1.调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)
            获取到所有需要导入到容器中的配置类
        2.利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader)
            得到所有的组件
          2.1在
loadSpringFactories中查找所有的META-INF/spring.factories(文件中是写死给容器的所有配置类)
            启动加载所有配置
        }
        但是会按照按照条件装配规则(@Conditional),最终会按需配置。

            SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先



    public @interface EnableAutoConfiguration {}

总结:

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 定制化配置
  • 用户直接自己@Bean替换底层的组件
  • 用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties


    

推荐阅读