zoukankan      html  css  js  c++  java
  • springboot的自动配置

    1.spring-boot启动的main入口

    SpringBootApplication注解,点击注解,发现这个注解中的@EnableAutoConfiguration 这个注解表示开启自动配置,自动配置一些组件
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import({AutoConfigurationImportSelector.class})
    public @interface EnableAutoConfiguration {
        String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    
        Class<?>[] exclude() default {};
    
        String[] excludeName() default {};
    }
    

      这个注解中import这个注解里

    AutoConfigurationImportSelector这个类就会扫描所有包,找到所有的配置类,点开这个类

    里面最重要的就是这个selectImports方法,我们来分析一下:
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
            if (!this.isEnabled(annotationMetadata)) {
                return NO_IMPORTS;
            } else {
                AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
                AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
                List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
                configurations = this.removeDuplicates(configurations);
                Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
                this.checkExcludedClasses(configurations, exclusions);
                configurations.removeAll(exclusions);
                configurations = this.filter(configurations, autoConfigurationMetadata);
                this.fireAutoConfigurationImportEvents(configurations, exclusions);
                return StringUtils.toStringArray(configurations);
            }
        } 

     

     AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);//会去调用loadMetadata方法,传入的是一个beanClassLoader

    查看loadMetadata发现其调用的是重载方法
     public static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader) {
            return loadMetadata(classLoader, "META-INF/spring-autoconfigure-metadata.properties");
        }
    
        static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, String path) {
            try {
                Enumeration<URL> urls = classLoader != null ? classLoader.getResources(path) : ClassLoader.getSystemResources(path);
                Properties properties = new Properties();
    
                while(urls.hasMoreElements()) {
                    properties.putAll(PropertiesLoaderUtils.loadProperties(new UrlResource((URL)urls.nextElement())));
                }
    
                return loadMetadata(properties);
            } catch (IOException var4) {
                throw new IllegalArgumentException("Unable to load @ConditionalOnClass location [" + path + "]", var4);
            }
        }

    打断点后发现是把“”META-INF/spring-autoconfigure-metadata.properties“”这个文件变成一个properties返回

    然后在org.springframework.boot下随便找一个配置类看一下具体实现,我这里找的是

    HttpEncodingAutoConfiguration

    这个类上面有个
    @EnableConfigurationProperties({HttpEncodingProperties.class})
    而点开这个类,里面就见到我熟悉的
    ConfigurationProperties
    说明我们要找的自动配置的类就在这里,
    @ConfigurationProperties(
        prefix = "spring.http.encoding"
    )
    

      

    这个类里面也是我们能够在springboot中能够使用的所有字段,验证一下

    
    

    
    
  • 相关阅读:
    把联系人从一张卡转移到另一张卡或者从一个手机转移到另一个手机
    Echarts画折线图
    Echarts画条形图
    Echarts画饼状图
    《计算机网络》读后感
    Vue.js项目无法启动:sh: 1: vue-cli-service: not found
    《Redis入门指南(第 2 版)》读后感
    翻译:《实用的Python编程》InstructorNotes
    翻译:《实用的Python编程》TheEnd
    翻译:《实用的Python编程》09_03_Distribution
  • 原文地址:https://www.cnblogs.com/qunincey/p/9729775.html
Copyright © 2011-2022 走看看