Spring Boot

十九. @EnableAutoConfiguration

2021-04-01  本文已影响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类型的完整类名

主要的作用:

/**
 * 使用内部工具 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方法 也有可以是属性

上一篇 下一篇

猜你喜欢

热点阅读