美文网首页Spring Boot
十九. @EnableAutoConfiguration

十九. @EnableAutoConfiguration

作者: 任未然 | 来源:发表于2021-04-01 16:09 被阅读0次

    一. 作用

    @EnableAutoConfiguration这个类很重要,主要的作用是自动载入应用程序所需要的所有默认配置,达到智能的自动配置作用

    主要是通过他来实现约定大于配置

    二. 源码

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    // 自动配置包
    @AutoConfigurationPackage
    // 给IOC容器导入组件
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
        String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
        Class<?>[] exclude() default {};
    
        String[] excludeName() default {};
    }
    

    三. 说明

    @Import(AutoConfigurationImportSelector.class) 这个注解里的AutoConfigurationImportSelector最为重要

    利用AutoConfigurationImportSelector@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

    四. AutoConfigurationImportSelector

    4.1 selectImports()方法

    首先执行selectImports()方法 中调用 getAutoConfigurationEntry()

        public String[] selectImports(AnnotationMetadata annotationMetadata) {
        ... 
            AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
                    annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    

    4.2 getAutoConfigurationEntry

    该方法主要作用获取EnableAutoConfiguration中的属性,调用getCandidateConfigurations()方法

        protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
                AnnotationMetadata annotationMetadata) {
                ...
              List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
             ..
        }
    

    4.3 getCandidateConfigurations

    获取候选的配置信息,在候选信息的中使用SpringFactoriesLoader.loadFactoryNames()

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
         //加载所有的配置类信息
            List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                    getBeanClassLoader());
            Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                    + "are using a custom packaging, make sure that file is correct.");
            return configurations;
        }
    

    4.4 SpringFactoriesLoader

    这个类中有一个比较重要的工具类SpringFactoriesLoader主要功能就是从指定的配置文件META-INF/spring-factories加载配置,spring-factories是一个典型的java properties文件,只不过KeyValue都是Java类型的完整类名

    主要的作用:

    • 扫描所有jar包类路径下 META-INF/spring.factories

    • 把扫描到的这些文件的内容包装成properties对象 从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,

    • 然后把他们添加在容器中 将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中

    /**
     * 使用内部工具 SpringFactoriesLoader,查找classpath上所有jar包中的META-INF\spring.factories
     * 找出其中key为org.springframework.boot.autoconfigure.AutoConfigurationImportFilter的属性定义的过滤器类并实例化。
     * AutoConfigurationImportFilter过滤器可以被注册到 spring.factories用于对自动配置类做一些限制,在这些自动配置类的字节码被读取之前做快速排除处理。
     * spring boot autoconfigure 缺省注册了一个 AutoConfigurationImportFilter :
     **/
        public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
            String factoryClassName = factoryClass.getName();
            return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
        }
    
    image
    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
    org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
    org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
    org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
    org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
    org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
    org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
    

    4.5 小结

    1. SpringBoot启动会加载大量的自动配置类

    2. 自动配置类添加组件的时候,会从properties类中获取某些属性。我们可以在配置文件中指定这些属性的值

      xxxxAutoConfigurartion:自动配置类给容器中添加组件

      xxxxProperties:对应配置文件中相关属性,在配置对象可以是setter方法 也有可以是属性

    相关文章

      网友评论

        本文标题:十九. @EnableAutoConfiguration

        本文链接:https://www.haomeiwen.com/subject/kmvtkltx.html