3.自动配置原理

  1. @SpringBootApplication:表明这个类是springboot的主配置类,也是一个组件,springboot将会运行这个类的main方法,来启动springboot应用;
    1. @ComponentScan():自动扫描包,并加载其符合条件的组件到容器中
    2. @SpringBootConfiguration :代表当前类是springboot的一个配置类
      1. @Configuration :代表这是一个配置类,然后作为一个组件添加到容器中
        1. @Component :被标注的类将会作为一个组件,添加到容器中
    3. @EnableAutoConfiguration :开启自动配置功能,以前需要手动配置的,现在配置这个类,springboot会自动配置;
      1. @AutoConfigurationPackage:自动配置包,即自动配置包下的一系列组件
        1. @Import(AutoConfigurationPackages.Registrar.class) :
          1. AutoConfigurationPackages :自动配置包  
          2. Registrar.class:将某个包(该注解所在的类的包,例如:com.nbg.boot.controller)下的所有组件进行批量注册
          3. import:就是给容器中导入一个组件(AutoConfigurationPackages.Registrar.class)
          4. static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
                /**
                 * new PackageImports(metadata).getPackageNames():获取该注解所在的包名:com.nbg.boot.controller
                 * @param metadata
                 * @param registry
                 */
                public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
                    register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
                }
                public Set<Object> determineImports(AnnotationMetadata metadata) {
                    return Collections.singleton(new PackageImports(metadata));
                }
            }
      2. @Import(AutoConfigurationImportSelector.class):选择必须的组件导入容器中,因为不可能所有的组件都导入到容器中,那太庞大,臃肿;
        1. getAutoConfigurationEntry :获取自动配置组件列表;
        2. List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes):获取候选组件
        3. /**
               * AutoConfigurationEntry :获取需要自动配置的组件列表
               * getCandidateConfigurations :获取候选的组件   
               * 然后在根据需要进行保留,例如:aop context jdbc 等;
               * 程序启动就加载该文件中的组件spring-boot-autoconfigure-2.4.1.jar!\META-INF\spring.factories👉# Auto Configure
               */
              protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
                  if (!isEnabled(annotationMetadata)) {
                      return EMPTY_ENTRY;
                  }
                  AnnotationAttributes attributes = getAttributes(annotationMetadata);
                  List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
                  configurations = removeDuplicates(configurations);
                  Set<String> exclusions = getExclusions(annotationMetadata, attributes);
                  checkExcludedClasses(configurations, exclusions);
                  configurations.removeAll(exclusions);
                  configurations = getConfigurationClassFilter().filter(configurations);
                  fireAutoConfigurationImportEvents(configurations, exclusions);
                  return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
              }
  2. 按需开启自动配置
    1. 虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
    2. 按照条件装配规则(@Conditional),最终会按需配置。 
    3. 总结:

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

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

       
posted @ 2020-12-29 22:39  nbg  阅读(119)  评论(0编辑  收藏  举报